2010-07-24 54 views
8

我正在使用C++源文件,其中我想要一个包含亚洲Unicode字符的带引号的字符串。在C++源文件中使用Unicode

我在Windows上使用QT,QT Creator开发环境在显示Unicode时没有问题。 QStrings在存储Unicode时也没有问题。当我在统一粘贴,它显示细腻,是这样的:

#define MY_STRING 鸟 

然而,当我保存,我可爱的Unicode字符都变成什么?分数。

我试图打开源文件并将其重新保存为Unicode编码。然后在QT Creator中正确显示并保存。然而,在编译时,似乎编译器不知道该怎么做,并且会抛出大量错误的错误和警告,比如“程序中的stray \ 255”和“忽略的空字符”。

在C++源文件中包含Unicode的正确方法是什么?

+4

什么编译您使用的?许多编译器(尤其是较老的编译器)不支持unicode源代码(尽管最新的编译器将支持通用字符名称)。 – 2010-07-24 20:47:13

+3

http://stackoverflow.com/questions/331690/c-source-in-unicode – 2010-07-24 20:53:08

+0

我使用g ++,大概来自QT安装的mingw。 – 2010-07-24 20:53:34

回答

8

个人而言,我在源代码中不使用任何非ASCII字符。原因是如果你在你的源文件中使用任意的Unicode字符,你不得不担心编译器认为源文件所在的编码,它将使用什么执行字符集以及它如何执行源代码字符集转换。

我认为将Unicode数据放在某种资源文件中会更好,它可以在编译时编译为静态数据或在运行时加载以获得最大的灵活性。通过这种方式,您可以控制编码的发生方式,而不必担心编译器的行为,这可能会受编译时本地语言环境设置的影响。

它确实需要更多的基础设施,但是如果您不得不实现国际化,那么花时间选择或开发灵活而强大的策略是非常值得的。

虽然可以在源代码中使用通用字符转义字符(L'\uXXXX')或显式编码的字节序列("\xXX\xYY\xZZ"),但这会使Unicode字符串几乎不可读。如果您有翻译,参与该流程的大多数人都可以更轻松地处理商定的通用字符编码方案中的文本。

2

您使用wchar_t接口吗?如果是这样,那么对于包含Unicode字符U + 1234(十六进制0x1234)的宽字符串,您希望L"\u1234"。 (看看QString头文件我认为这是你所需要的。)

如果不是,并且你的接口是UTF-8,那么你首先需要用UTF-8编码你的字符,然后创建一个包含字符串那,例如"\xE0\xF8"或类似的。

5

使用L前缀和\u\U符号转义Unicode字符:

Section 6.4.3 of the C99 specification限定\u转义序列。

例子:

#define MY_STRING L"A \u8801 B" 
/* A congruent-to B */ 
+1

** U + 8801 **是[Unicode汉字'幼虫,gr''](http://www.fileformat.info/info/unicode/char/8801/index.htm)。在你的例子中,你是否打算使用[符号,数学类别中的Unicode字符]中的字符(http://www.fileformat.info/info/unicode/category/Sm/list.htm)? – DavidRR 2015-04-14 16:00:37

+1

@DavidRR:这[更有意义](http://www.fileformat.info/info/unicode/char/2261/index.htm)。 Unicode表示法以十六进制表示。也许Heath将这个符号与HTML默认为十进制混淆。 – usr2564301 2015-04-14 17:30:08

+0

@Jongware:是的,很好。希思可能打算“相同”(相同)。 – DavidRR 2015-04-14 17:56:07