【发布时间】:2014-05-05 12:01:24
【问题描述】:
无法理解 u8-literals 的语义,或者更确切地说,无法理解 g++ 4.8.1 上的结果
这是我的期望:
const std::string utf8 = u8"åäö"; // or some other extended ASCII characters
assert( utf8.size() > 3);
这是 g++ 4.8.1 上的结果
const std::string utf8 = u8"åäö"; // or some other extended ASCII characters
assert( utf8.size() == 3);
- 源文件为 ISO-8859(-1)
- 我们使用以下编译器指令:-m64 -std=c++11 -pthread -O3 -fpic
在我的世界里,无论源文件的编码如何,生成的 utf8 字符串都应该长于 3。
或者,我是否完全误解了 u8 的语义以及它所针对的用例?请赐教。
更新
如果我明确告诉编译器源文件的编码是什么,正如许多人建议的那样,我得到了 u8 文字的预期行为。 但是,常规文字也会被编码为 utf8
即:
const std::string utf8 = u8"åäö"; // or some other extended ASCII characters
assert( utf8.size() > 3);
assert( utf8 == "åäö");
- 编译器指令:g++ -m64 -std=c++11 -pthread -O3 -finput-charset=ISO8859-1
- 尝试了一些从 iconv 定义的其他字符集,例如:ISO_8859-1 等等...
我现在比以前更糊涂了……
【问题讨论】:
-
"源文件是 ISO-8859(-1)" 并且 gcc 应该知道...如何?使用
-finput-charset=...或者使用utf8源文件 -
实际上 gcc 应该查看您的语言环境来确定编码,但我听说这方面存在错误,所以最好还是明确指定输入字符集。
-
@Fredrik 我对文本文字以及它们如何解释/存储以及它们与源文件编码的关系有类似的疑问,但my question was about Raw string literals。
-
@Fredrik 但源输入的编码与编译器对其输出的字符串使用的编码无关。没有理由对两者使用相同的编码。源编码 can 在 TU 之间有所不同,但如果结果程序中的字符串文字因此使用不同的编码,那将是非常出乎意料的。 TU 编码不影响
u8文字的结果。对你的编译器撒谎(或不通知它)源文本是什么编码意味着编译器不可能正确转换为 UTF-8 或任何其他编码 -
如果你想让任何个软件正确处理文本,不管它是编译器、文本编辑器还是其他任何东西,那么你必须确保它知道源文本使用哪种编码,并且您必须告诉它输出使用哪种编码。如果您在它认为看到 UTF-8 文本时给它 ISO-8859 文本,那么无论您告诉它转换为哪种编码,它都会生成垃圾输出。