【发布时间】:2017-05-01 07:08:18
【问题描述】:
在装有 Visual Studio 2015 的 Windows 上
// Ü
// UTF-8 (hex) 0xC3 0x9C
// UTF-16 (hex) 0x00DC
// UTF-32 (hex) 0x000000DC
using namespace std::string_literals;
const auto narrow_multibyte_string_s = "\u00dc"s;
const auto wide_string_s = L"\u00dc"s;
const auto utf8_encoded_string_s = u8"\u00dc"s;
const auto utf16_encoded_string_s = u"\u00dc"s;
const auto utf32_encoded_string_s = U"\u00dc"s;
assert(utf8_encoded_string_s == "\xC3\x9C");
assert(narrow_multibyte_string_s == "Ü");
assert(utf8_encoded_string_s == u8"Ü");
// here is the question
assert(utf8_encoded_string_s != narrow_multibyte_string_s);
"\u00dc"s 与 u8"\u00dc"s 不同或 "Ü"s 与u8"Ü"s
显然,通常字符串文字的默认编码不是 UTF-8(可能是 UTF-16),即使它们具有相同的语义,我也不能在不知道其编码的情况下比较两个 std::string。
在启用 unicode 的 c++ 应用程序开发中执行这种字符串比较的做法是什么??
例如这样的 API:
class MyDatabase
{
bool isAvailable(const std::string& key)
{
// *compare* key in database
if (key == "Ü")
return true;
else
return false;
}
}
其他程序可能使用 UTF-8 或默认(UTF-16?)编码的 std::string 调用 isAvailable。我怎样才能保证进行适当的比较?
我可以在编译时检测到任何编码不匹配吗?
注意:我更喜欢 C++11/14 的东西。 比 std::wstring 更喜欢 std::string
【问题讨论】:
-
UTF-16 仅与
wstring一起使用,在您的问题中每次提到它绝对是一个错误的猜测。默认编码可能是编译时的当前 ANSI 代码页。或者更准确地说,默认是不重新编码,保留源文件的编码,出于语法处理的目的,编译器假定为ANSI。
标签: c++11 unicode utf-8 stdstring string-literals