我正在使用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
。我正在处理的东西也可能有日文字符等......
答案 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。您也可以编写自己的转换例程。这不是太难。