在Windows上使用Visual Studio 2015年比較統一的std :: string與常規 「」 文字或U8 「」 declartion
// Ü
// 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」小號或的「u」是不一樣的U8的「u」
顯然用於通常字符串文字默認編碼不是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)編碼調用isAvailable用的std :: string。我如何保證做適當的比較?
我可以在編譯時檢測到任何編碼不匹配嗎?
注:我更喜歡C++ 11/14的東西。 不想的std :: string比的std :: wstring的
UTF-16只與'wstring'一起使用,在你的問題中每提及一次肯定是錯誤的猜測。默認編碼可能是編譯時的當前ANSI代碼頁。或者更確切地說,默認值是不重新編碼,源文件的編碼被保留,並且語法處理的目的是,編譯器假定爲ANSI。 –