簡體   English   中英

C ++ std:string比較編碼問題

[英]C++ std:string comparation codification problems

我認為std :: string比較與編碼有問題。 問題是我討厭比較接收到的字符串,但我不知道它與帶有不常用字符的西班牙語字符串的編碼方式如何。 我無法更改s_area.m_s_area_text,因此我需要將s2字符串設置為相同的值,並且我不知道如何以通用的方式來進行其他處理。

std::string s2= "Versión de sistema";  
std::cout << s_area.m_s_area_text << std::endl;

for (const char* p = s2.c_str(); *p; ++p)
{
   printf("%02x", *p);
}
printf("\n");


for (const char* p = s_area.m_s_area_text.c_str(); *p; ++p)
{
   printf("%02x", *p);
}
printf("\n");

執行的結果是:

Versi├│n de sistema
5665727369fffffff36e2064652073697374656d61
5665727369ffffffc3ffffffb36e2064652073697374656d61

顯然,由於2個字符串的字節值不同,因此所有compare方法都會失敗:strncmp,std :: string ==,std:sstring.comapre等。

關於如何觸摸s_area.m_s_area_text字符串該怎么辦?

通常,不可能通過檢查字符串的原始字節來猜測字符串的編碼。 該規則的例外是在字節流的開始處出現字節順序標記(BOM)時。 BOM將告訴您字節是哪個unicode編碼以及字節順序。

順便說一句,如果將來某個時候您決定需要規范的字符串編碼(正如某些人在評論中指出的那樣,那將是一個好主意)。 有很多人贊成將UTF-8作為C ++的最佳選擇。 有關更多信息,請參見UTF-8

首先,兩個正確比較兩個字符串,您至少需要知道它們的編碼。 在您的示例中, s_area.m_s_area_text恰好是用UTF-8編碼的,而對於s2 ISO / IEC 8859-1(Latin-1)。

如果您確定s_area.m_s_area_text將始終以UTF-8編碼,則可以嘗試使s2使用相同的編碼,然后進行比較。 定義UTF-8編碼的字符串的一種方法是使用\\u\u003c/code>將每個不在基本字符集中的字符轉義。

std::string s2 = u8"Versi\u00F3n de sistema";
...
if (s_area.m_s_area_text == s2)
...

通過為源文件設置適當的編碼並為編譯器指定編碼,也可以在不轉義字符的情況下執行此操作。

如@nwp所述,您可能還想在比較之前對字符串進行規范化。 否則,看起來相同的兩個字符串可能具有不同的Unicode表示形式,這將導致您的比較產生錯誤的否定結果。 例如,“ Version de sistema”將不等於“Versiónde sistema”。

暫無
暫無

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

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