2017-11-07 7 views
1

私はstd :: stringに問題があります。問題は、受け取った文字列を比較することが嫌なことです。文字化けしたスペイン語の文字列とどのようにコード化されているのかわかりません。私はs_area.m_s_area_textを変更できないので、s2の文字列を同じ値に設定する必要があり、他のチェイスの一般的な方法でそれを行う方法はわかりません。C++ std:string比較体系化の問題

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つの文字列が同じバイト値を持っていないように、すべての方法が失敗した比較:strncmpは、STD ::文字列==、 std:sstring.comapreなど

どのようにs_area.m_s_area_text文字列に触れたらいいですか?

+0

コード内の文字列を比較しないでください。 – user463035818

+0

バイトを比較するのではなく、何か他のものを比較する関数が必要なようです。このような関数を書くか、または両方の文字列を正規表現に変換して、バイト比較関数で十分です。それは無視したいバイトに依存します。 – nwp

+0

私はcompare関数をスキップしました...それらのすべてがfalseを返します。私はすべての文字をskkipingせずに文字列全体を比較する必要があります。 –

答えて

0

一般に、生のバイトを調べることによって文字列のエンコーディングを推測することは不可能です。この規則の例外は、バイトオーダーマーク(BOM)がバイトストリームの先頭にある場合です。 BOMは、バイトがエンコードされているユニコードとエンディアンを示します。

将来、ある時点で、正式な文字列エンコーディングが必要であると判断した場合(コメントの中には良いアイデアがあると指摘している人もいるので) C++にとって最良の選択肢として、UTF-8を支持する強力な議論があります。詳細については、UTF-8 everywhereを参照してください。

0

まず、2つの文字列を2つの文字列と比較すると、少なくともそのエンコーディングを知る必要があります。あなたの例では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でエンコードされた文字列を定義する1つの方法は、基本文字セットにないすべての文字を\uでエスケープしています。

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

また、ソースファイルのための適切なエンコーディングを設定してコンパイラにエンコーディングを指定することで、文字をエスケープせずにそれを行うことが可能であるべきです。

@nwpで説明したように、比較する前に文字列を正規化することもできます。そうでなければ、同じように見える2つの文字列が異なるUnicode表現を持つ可能性があり、その結果、比較結果が偽の結果になります。 たとえば、 "Versiónde sistema"は "Versiónde sistema"と同じではありません。