linux中的unicode char不能在windows中运行

时间:2014-06-02 08:27:31

标签: linux windows unicode character-encoding

我在Linux中有一个Linux程序(Ubuntu 13.04)。

#include<stdio.h>

int main()
{
    char* cp = "ӐҖ";
    printf("%s\n",cp);
    printf("%d\n",sizeof(*cp));
    printf("%d\n",(unsigned int)*cp);
    return 0;
}

第一个和第二个printf的输出为:

ӐҖ
1

分别

1。)我的第一个问题是,在第3个printf中,我试图将字符转换为unsigned int,试图看到代表第一个字符的unicode代码点但是我得到了-45。我应该使用哪种最佳方法来查看由1字节“char”数据类型表示的单个unicode字符的unicode代码点?

2。)第二个问题,当我将此代码移植到Windows 7时,[char * cp =“ӐҖ”;]将导致编译器“警告C4566:由通用字符名称'\ uFFE6'表示的字符不能是在当前代码页(932)中表示“。当我运行它时,输出是:

??
1

Windows是否不支持“char”数据类型中的unicode?那么我应该使用什么字符数据类型来使我的代码从Linux移植到Windows?

1 个答案:

答案 0 :(得分:1)

C不支持Unicode。 C ++也不是。如果您有兴趣,可以使用图书馆,或者如果需要,您可以手动滚动自己的例程。

C中的

char不是“字符”类型,它是字节类型。我假设你用UTF-8编写了你的​​源代码。

GCC按字面解释字符串文字中的字节。您已定义了5个字节的序列:d3 90 d2 96 00。 (d3被解释为signed char是-45。)你可以尝试使用strlen,它应该返回4.大多数Unix和C API是面向字节的,所以当你打印出那些字节时,屏幕上显示的内容取决于终端仿真程序使用的编码。通常它是UTF-8,所以一切正常。

如果源是UTF-8,则MSVC将字符串和字符文字视为您要显示的内容(即文本),然后将它们编码在系统的默认代码页中。因此,如果您编写"à",如果您使用CP-1252,它将重新编码为e0 00。如果您使用的编码没有à(例如,您使用的是ŕ e0的CP-1250),则会出现问号。

但MSVC如何知道文件中的文字是什么?它寻找UTF-8 BOM。如果您的文本文件不是以BOM开头,则MSVC假定文件的编码是默认的系统编码,并且不尝试转换任何内容 - 它会像看到GCC一样留下字节。

(注意:我看到你使用ShiftJIS;它可能会导致问题,因为它不兼容ASCII,我不知道MSVC如何处理它。请谨慎行事。)

如果您需要处理Unicode文本并使用MSVC,您还可以使用wide string literals。 GCC也支持它们,尽管它缺少许多可以使用它们的库函数。但我是UTF-8 manifesto的坚定支持者,我建议尽可能多地使用UTF-8字符串。

请注意,如果删除BOM,则不再可以在MSVC中使用宽字符串文字。

编辑:请看这里有关MSCV亚洲开发人员的更多讨论和经验:How to create a UTF-8 string literal in Visual C++ 2008长话短说:它不漂亮。