簡體   English   中英

C ++中的非ASCII字符串字符索引

[英]Non-ASCII String Character Index in C++

我正在做一個小的C ++應用程序,該應用程序執行一些字符串處理。 目前,我想提取特定字符索引處的字符串。 我使用字符串的at()方法的幼稚解決方案效果很好,但是對於非ascii字符串卻無法使用。 例如:

string test = "ヘ(^_^ヘ)(ノ^_^)ノ"
cout << test.at(0) << endl;

在gcc 4.2下為我生成一個磅符號作為輸出。 我也不認為終端有問題,因為我可以很好地打印出整個字符串。 是否有圖書館或可以用來達到預期效果的東西?

string使用的char僅為8位。 如果要編碼16位字符,則需要使用wstring

您的字符串可能是UTF-8,其中的“字符”和“字節”不是一回事。 std::string類假定“字符”每個都是一個字節,因此結果是錯誤的。

您的選擇是將字符串轉換為UTF-16並使用wstring ,您可以(通常)假設每個字符都是兩個字節( wchar_tshort ),或者您可以使用ICUUTF8-CPP之類的庫直接對UTF-8字符串進行操作,例如執行“獲取第3個字符”而不是“獲取第3個字節”。

或者,如果您想變得極簡,則可以通過重復使用UTF-8字符串長度函數之一的內部函數,編寫一個(相對)簡單的函數來獲取特定字符的字節偏移量和長度。上面列出的或來自google的庫。 基本上,您必須檢查每個字符並向前跳1-3個字節,以根據所設置的位到達下一個字符的開頭。

這是可以從PHP輕松翻譯的一種:

for($i = 0; $i < strlen($str); $i++) {
    $value = ord($str[$i]);
    if($value > 127) {
        if($value >= 192 && $value <= 223)
            $i++;
        elseif($value >= 224 && $value <= 239)
            $i = $i + 2;
        elseif($value >= 240 && $value <= 247)
            $i = $i + 3;
        else
            die('Not a UTF-8 compatible string');
        }
    $count++;
} 

http://www.php.net/manual/zh/function.strlen.php#25715

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM