我正在使用 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/