2015-12-29 30 views
0

,我發現自己需要的方式來改變一個字符串以降低該是安全的使用ASCII和UTF16-LE(如在某些Windows註冊表字符串中)的情況下和整個這次來到問題:How to convert std::string to lower case?伊斯蘭法院聯盟選擇編碼::的UnicodeString

對我來說似乎是「最正確的」(我沒有使用Boost)的答案是demonstrated using the icu library

在這個答案,他指定的編碼「ISO-8859-1」,爲的UnicodeString構造函數。爲什麼這是正確的價值,我怎麼知道要使用什麼?

ISO-8859-1,先後在幾個單元測試,我針對只使用拉丁字符的ASCII編碼字符串運行,但我不喜歡使用它,如果我不知道爲什麼。

如果有問題,我主要關心的是操縱英文數據,通常以ASCII碼存儲,但Windows註冊表有能力存儲UTF-16LE的東西,我不想阻止自己支持其他語言通過亂扔我的代碼與非unicode安全的東西下來的語言。

+0

如果UTF-16字符串包含不符合ASCII的文本......您希望在此轉換結果中存儲什麼ASCII字符? –

+0

字節只是字節,你只需要知道它們的編碼。在某種程度上,你可以做出有根據的猜測,但這些仍然是猜測。例如,幾年前在某些Windows內置編輯器上看到了「此應用可能失敗」的災難。 –

+0

@NicolBolas:我澄清了這個問題,關於我對案件轉換的推理。我不在UTF-16LE和ASCII之間轉換。我只需要能夠strlower()一個字符串,所以我可以以不區分大小寫的方式進行比較,而不必關心字符串是ASCII還是UTF-16LE(在我的代碼中,被比較的兩個字符串在編碼中總是匹配, m從不比較ASCII到UTF16-LE) – Matthew

回答

1

,我發現自己需要的方式來改變一個字符串,不區分大小寫字符串比較的目的小寫

UnicodeString在ICU有很多caseCompare()方法來執行比較「不區分大小寫使用全案摺疊「。你不需要手動轉換你的字符串。

在這個答案中,他指定了UnicodeString構造函數的編碼「ISO-8859-1」。爲什麼這是正確的價值,我怎麼知道要使用什麼?

因爲作者正在將ISO-8859-1編碼的char*字符串文字傳遞給構造函數。 UnicodeString代表一個UTF-16編碼的字符串。如果使用char*作爲輸入來構造它,則必須指定輸入數據編碼的正確字符集,因此UnicodeString可以將其解碼爲Unicode,然後將其重新編碼爲UTF-16。