linux中的unicode字符不';我不能在windows下工作

linux中的unicode字符不';我不能在windows下工作,linux,windows,unicode,character-encoding,Linux,Windows,Unicode,Character Encoding,我有一个C语言的Linux(Ubuntu 13.04)程序 分别 1.)我首先关心的是,在第3个printf中,我试图将字符转换为无符号int,以查看表示第一个字符的unicode代码点,但我得到了-45。我应该使用什么样的最佳方法来查看由1字节“char”数据类型表示的单个unicode字符的unicode码点 2.)第二个问题,当我将此代码移植到Windows 7时,[char*cp=“ӐҖ”]将导致编译器“警告C4566:通用字符名“\uFFE6”表示的字符无法在当前代码页(932)中表示

我有一个C语言的Linux(Ubuntu 13.04)程序

分别

1.)我首先关心的是,在第3个printf中,我试图将字符转换为无符号int,以查看表示第一个字符的unicode代码点,但我得到了-45。我应该使用什么样的最佳方法来查看由1字节“char”数据类型表示的单个unicode字符的unicode码点

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

??
1

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

C不支持Unicode。C++也不存在。如果您感兴趣,可以使用这些库,如果需要,也可以手动滚动自己的例程

C中的
char
不是“字符”类型,而是字节类型。我假设您是用UTF-8编写源代码的

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

如果源代码是UTF-8格式,MSVC会将字符串和字符文本视为您希望显示的内容(即文本),然后在系统的默认代码页中对其进行编码。因此,如果您编写
“a”
,如果您使用CP-1252,它将被重新编码为
E000
。如果您使用没有
的编码(例如,您使用CP-1250,它在
e0
处有
ŕ
),您将得到一个问号

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

(注意:我看到您使用ShiftJIS;它可能会导致问题,因为它与ASCII不兼容,我不知道MSVC如何处理它。请小心操作。)

如果需要处理Unicode文本并使用MSVC,也可以使用。GCC也支持它们,尽管它缺少许多可以使用它们的库函数。但我强烈支持UTF-8字符串,我建议尽可能多地使用UTF-8字符串

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


<>编辑:请参见C++ MSCV的亚洲开发者的更多讨论和经验:长篇短文:它不漂亮。

C++ 11为Unicode在核心C++语言中添加了更多的支持,而不仅仅是宽文字(通过<代码> L/COD>文字前缀)。它为16/32位字符引入了新的数据类型,为UTF-8/16/32文本引入了新的前缀,为UTF-16/32字符串引入了新的
basic_string
typedefs,为UTF数据转换引入了新的
std::codevt
类型。
ӐҖ
1
??
1