【问题标题】:unicode char in linux doesn't work in windowslinux中的unicode char在windows中不起作用
【发布时间】:2014-07-22 07:36:57
【问题描述】:

我有一个 C 语言的 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.) 我首先担心的是,在第三个 printf 中,我尝试将字符转换为 unsigned int 以尝试查看代表第一个字符的 unicode 代码点,但我得到 -45。我应该使用什么来查看由 1 字节“char”数据类型表示的单个 unicode 字符的 unicode 代码点的最佳方法?

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

??
1

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

【问题讨论】:

    标签: linux windows unicode character-encoding


    【解决方案1】:

    C 不支持 Unicode。 C++ 也没有。如果您有兴趣,可以使用相应的库,或者如果需要,您可以手动滚动您自己的例程。

    C 中的

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

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

    如果源是 UTF-8,MSVC 将字符串和字符文字视为您想要显示的内容(即文本),然后在系统的默认代码页中对它们进行编码。所以如果你写"à",如果你使用CP-1252,它将被重新编码为e0 00。如果您使用没有à 的编码(例如您使用CP-1250,在e0ŕ),您将得到一个问号。

    但是 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 长话短说:它不漂亮。

    【讨论】:

    • C++11 为核心 C++ 语言增加了对 Unicode 的更多支持,而不仅仅是 宽文字(通过 L 文字前缀)。它为 16/32 位字符引入了新的数据类型,为 UTF-8/16/32 文字引入了新的前缀,为 UTF-16/32 字符串引入了新的 basic_string typedef,以及用于 UTF 数据转换的新 std::codecvt 类型。
    猜你喜欢
    • 2021-09-08
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2015-01-09
    • 2020-11-05
    • 2018-11-07
    • 2020-09-12
    相关资源
    最近更新 更多