我想對utf8文本文件進行一些簡單的字符串處理。 這將意味着從一條線中取出子串並將它們重新排列。使用utf8語言環境進行C++字符串處理
由於我的linux電腦有一個utf8語言環境,我不打算在其他地方運行 程序,因此將語言環境設置爲utf8似乎是要走的路。 調整一個例子,我得到了以下測試程序。 如果你給它一個希臘詞,它會輸出相同的結果,但輸出substr的結果只會產生垃圾。 是否有另一個我可以使用或正在使用utf8語言環境的函數完全是錯誤的路徑?
#include <string>
#include <iostream>
int main()
{
std::string newwd;
setlocale(LC_ALL, "");
std::cout << "Enter greek word ";
std::string wordgr;
std::getline(std::cin, wordgr);
std::cout << "The word is " << wordgr << "." << std::endl;
newwd=wordgr.substr(2,1) ;
std::cout << "3rd letter is " << wordgr.substr(2,1) << " <" << std::endl;
return 0;
}
UTF-8是一種可變長度編碼; UTF-8中的給定字符可以在1到6個字節之間。這會導致substr()方法,*對字節進行操作,而對字符*進行操作以產生意外的結果。 UTF-8中的希臘字符不是單字節字符。如果輸入4個字符的希臘字符串,然後在該字上調用'std :: string.length()',則會得到大於4個字節(最可能是8個字節)的結果。 –
@KenP你應該發佈這個答案。 :) – 0x499602D2
一個非常簡單的解決方案是在整個過程中切換到wstring和wiostream和wchar_t。 –