我想將包含重音的字符串轉換爲C++中的純ASCII字符串(用於編制索引)。我知道這個問題已被問過無數次,但與其他人不同,我沒有選擇加入任何第三方庫,如ICU甚至使用boost。在沒有ICU或boost的C++中規範unicode字符?
到目前爲止,我已經嘗試創建地圖重音符號,以標準化的字符(無符號字符爲unsigned char)像下面
map<unsigned char, unsigned char> myMap;
myMap['ì'] = 'i'; //few more like this
,然後這個功能
string result;
for(size_t i = 0; i < inputString.size(); i++) {
if(myMap.count(inputString[i]) > 0) {
result += myMap[inputString[i]];
} else {
result += inputString[i];
}
}
但是當我嘗試它像「Forlì」這樣的字符串,它會返回我Forl<C3>i
。爲什麼?我怎樣才能刪除這個額外的<C3>
?
請注意,這將是生產級別的代碼,所以我將避免包括這樣一個小的變化(只是重音字符的情況下可由unsigned char表示)的重類。
我想提醒一下,ICU和Boost C++庫都是免費且開源的。這意味着您可以隨時隨地獲取源文件,並查看它們是如何執行的。當我試圖「重新發明輪子」時,這總是適用於我。 – Drop 2015-03-03 06:00:06
我實際上試過包括他們,但ICU給我垃圾(???)charcters而不是規範化的值,並且總是有許可問題。此外,ICU不是開發者友好的,並且在這種情況下字符串類型之間存在大量不必要的轉換 – rockstarjindal 2015-03-03 06:04:50
@rockstarjindal:如果您試圖在'unsigned char'中填充大約100K的Unicode字符,則垃圾是可預期的。 ''í''可能正常工作,但它不可能是Unicode。 – MSalters 2015-03-03 08:08:50