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

时间:2017-03-18 17:52:55

标签: 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。我正在处理的东西也可能有日文字符等......

1 个答案:

答案 0 :(得分:3)

C语言环境和wchar函数的问题在于它们与平台高度相关。对于它的价值,我在使用Linux上的en_US.UTF-8语言环境(Ubuntu 16.04)将Cyrillic 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

正如所料。在其他平台上,您的里程可能会有所不同像Windows一样的16位wchar_t的平台特别成问题。但是一个理智的平台应该能够使用任何UTF-8语言环境对所有Unicode字符进行编码和解码,因此不需要通用的UTF-8语言环境。

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