rub*_*nvb 11 c++ encoding string-literals c++11
可以通过前缀字符串文字与写在C++ 11 UTF-8/16/32字符串文字u8/ u/ U分别.编译器如何解释这些新类型的字符串文字中包含非ASCII字符的UTF-8文件?我理解标准没有指定文件编码,而这个事实本身就会使源代码中非ASCII字符的解释完全未定义的行为,使得这个特性有点不太有用.
我知道你仍然可以逃脱单个unicode字符\uNNNN,但这对于完整的俄语或法语句子来说并不是很易读,因为它通常包含多个unicode字符.
我从各种来源理解的是,它u应该等同L于当前的Windows实现和ULinux实现.因此,考虑到这一点,我也想知道旧字符串文字修饰符所需的行为是什么......
对于代码示例猴子:
string utf8string a = u8"L'hôtel de ville doit être là-bas. Ça c'est un fait!";
string utf16string b = u"L'hôtel de ville doit être là-bas. Ça c'est un fait!";
string utf32string c = U"L'hôtel de ville doit être là-bas. Ça c'est un fait!";
Run Code Online (Sandbox Code Playgroud)
在理想的世界中,所有这些字符串都产生相同的内容(如:转换后的字符),但我使用C++的经验告诉我,这绝对是实现定义的,并且可能只有第一个才能做我想要的.
在GCC中,使用-finput-charset=charset:
设置输入字符集,用于从输入文件的字符集转换为GCC使用的源字符集.如果区域设置未指定,或GCC无法从区域设置获取此信息,则默认值为UTF-8.这可以通过语言环境或此命令行选项覆盖.目前,如果存在冲突,命令行选项优先.charset可以是系统的"iconv"库例程支持的任何编码.
还可以查看选项-fexec-charset和-fwide-exec-charset.
最后,关于字符串文字:
char a[] = "Hello";
wchar_t b[] = L"Hello";
char16_t c[] = u"Hello";
char32_t d[] = U"Hello";
Run Code Online (Sandbox Code Playgroud)
字符串文字的大小改性剂(L,u,U)仅仅确定类型字面的.
编译器如何解释这些新类型的字符串文字中包含非ASCII字符的UTF-8文件.我理解标准没有指定文件编码,而这个事实本身就会使源代码中非ASCII字符的解释完全未定义的行为,使得这个特性有点不太有用.
来自n3290,2.2阶段的翻译[lex.phases]
如果需要,物理源文件字符以实现定义的方式映射到基本源字符集(引入行尾指示符的换行符).接受的物理源文件字符集是实现定义的.[ 这里有一些关于三元组的内容.不在基本源字符集(2.3)中的任何源文件字符将替换为指定该字符的通用字符名称.(实现可以使用任何内部编码,只要在源文件中遇到实际扩展字符,并且在源文件中表示为与通用字符名称相同的扩展字符(即,使用\ uXXXX表示法),处理等效,除非在原始字符串文字中还原此替换.)
有很多标准术语用于描述实现如何处理编码.这是我尝试对所发生的事情进行更为简单,逐步的描述:
物理源文件字符以实现定义的方式映射到基本源字符集[...]
文件编码的问题是handwaved; 标准只关心基本的源字符集,并为实现提供了空间.
不在基本源字符集(2.3)中的任何源文件字符将替换为指定该字符的通用字符名称.
基本源集是允许字符的简单列表.它不是ASCII(进一步参见).不在此列表中的任何内容都被"转换"(至少在概念上)到\uXXXX表单.
因此,无论使用何种文字或文件编码,源代码都在概念上转换为基本字符集+一堆\uXXXX.我在概念上说,因为实现的实际操作通常更简单,例如因为它们可以直接处理Unicode.重要的是,标准称为扩展字符(即不是来自基本源集)的内容应该与其等效\uXXXX形式无法区分.请注意,C++ 03可用于例如EBCDIC平台,因此您在ASCII方面的推理存在缺陷.
最后,我描述的过程也发生在(非原始的)字符串文字中.这意味着您的代码与您编写的代码相同:
string utf8string a = u8"L'h\u00F4tel de ville doit \u00EAtre l\u00E0-bas. \u00C7a c'est un fait!";
string utf16string b = u"L'h\u00F4tel de ville doit \u00EAtre l\u00E0-bas. \u00C7a c'est un fait!";
string utf32string c = U"L'h\u00F4tel de ville doit \u00EAtre l\u00E0-bas. \u00C7a c'est un fait!";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3414 次 |
| 最近记录: |