c - 是否有适用于任何语言/国家/地区的 UTF-8 语言环境?

标签 c unicode utf-8 utf8mb4

我正在使用 C 进行编程,并且希望将任何 UTF(即“ru_RU-UTF-8”、“en_EN-UTF-8”等)全部转换为 wchar_t 版本(使用 mbrtowc 函数)。它具体转换为哪个 wchar_t 甚至并不重要,只要它在某些本地是有效的 wchar_t 即可。

是否有“UTF-8-whatever”设置可以传递给语言环境?

就像我正在寻找与 setlocale("POSIX")/setlocale("C") 完全相反的内容。

澄清一下,C 代码...

setlocale(LC_ALL, "ru_RU.UTF-8");
stuff = mbrtowc(..... )

可以工作,其中 C 代码...

setlocale(LC_ALL, "en_US.UTF-8");
stuff = mbrtowc(..... )

一旦击中西里尔字母就返回-1。我正在处理的东西也可能有日语字符等......

最佳答案

C 中的区域设置和 wchar 函数的问题在于它们高度依赖于平台。无论如何,我可以在 Linux (Ubuntu 16.04) 上使用 en_US.UTF-8 语言环境将西里尔语 UTF-8 转换为 wchars。代码如下

#include <locale.h>
#include <stdio.h>
#include <wchar.h>

int main() {
    const char in[] = "\xD0\xB1";
    wchar_t out;
    size_t consumed;

    setlocale(LC_ALL, "en_US.UTF-8");
    consumed = mbrtowc(&out, in, sizeof(in) - 1, NULL);
    if (consumed > 0) {
        printf("%04x\n", (unsigned)out);
    }

    return 0;
}

打印

0431
正如预期的那样。在其他平台上,您的里程可能会有所不同。具有 16 位 wchar_t 的平台(例如 Windows)尤其存在问题。但一个健全的平台应该能够使用任何 UTF-8 语言环境对所有 Unicode 字符进行编码和解码,因此不需要通用的 UTF-8 语言环境。

如果您只想使用 UTF-8,则应该考虑用于 UTF-8 转换的库,例如 iconv、utf8proc、libunistring 或 ICU。您还可以编写自己的转换例程。这并不难。

关于c - 是否有适用于任何语言/国家/地区的 UTF-8 语言环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42877845/

相关文章:

c - 子进程不读取 PIPE

转换后的字符串未能包含正确的 float 值

c - 结构填充说明

c - 是否可以制作一个 Box 并要求用户在中间插入一些东西?

php - 您将如何创建所有 UTF-8 字符的字符串?

php - UTF8 读取波斯字符串为 ?在 MySQL 5.0 中

用于检查字符串是否来自单个脚本的 PHP 正则表达式

java - 从文件转换 UTF-8 读取 unicode 行

python - 统一码编码错误 : 'ascii' codec can't encode character u'\xe9'

Android 2.2 webview 不支持泰米尔语字体