2016-08-20 7 views
1

出力がUTFと関係しているとは思いますが、どうすればよいか分かりません。 誰か説明してください。std :: string :: size()strange behavior

#include <iostream> 
#include <cstdint> 
#include <iomanip> 
#include <string> 

int main() 
{ 

    std::cout << "sizeof(char) = " << sizeof(char) << std::endl; 
    std::cout << "sizeof(std::string::value_type) = " << sizeof(std::string::value_type) << std::endl; 

    std::string _s1 ("abcde"); 
    std::cout << "s1 = " << _s1 << ", _s1.size() = " << _s1.size() << std::endl; 


    std::string _s2 ("abcdé"); 
    std::cout << "s2 = " << _s2 << ", _s2.size() = " << _s2.size() << std::endl; 

    return 0; 
} 

出力は次のようになります。

QTCreatorは次のようにコンパイル

sizeof(char) = 1  
sizeof(std::string::value_type) = 1  
s1 = abcde, _s1.size() = 5  
s2 = abcdé, _s2.size() = 6 

g++ --versionプリントg++ (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609

g++ -c -m32 -pipe -g -std=c++0x -Wall -W -fPIC -I../strsize -I. -I../../Qt/5.5/gcc/mkspecs/linux-g++-32 -o main.o ../strsize/main.cpp 
g++ -m32 -Wl,-rpath,/home/rodrigo/Qt/5.5/gcc -o strsize main.o 

どうもありがとう!

+1

'sizeof( 'é')'を印刷して、あなたが得るものを見てください。 – Peter

+0

お時間をいただきありがとうございます。 ; ' 'のstd :: COUT < 'のstd :: COUT << "はsizeof(E '')=" <<はsizeof( 'E')<<はstd :: ENDL: 私は、これらの2行を追加しました< "はsizeof(\" é\ ")=" <<はsizeof( "E")<<はstd ::てendl; ' そして、出力された:' 'のはsizeof( 'E')= 4' sizeof(「E」)= 3'は、はsizeof(「E」) 'おそらくそのサイズは、文字列リテラル'「E」4である理由を説明するだろうint' 'へ' char'を推進して 'は' @canellasです – canellas

+1

'ue'はUTF-8(0xC3 0xA9)で2つの' char'sでエンコードされ、その後にヌルターミネータが続くため、 'sizeof("é ")'は 'const char []'と同じです。 –

答えて

4

éはutf-8で2バイトの0xC3 0xA9としてエンコードされます。

3

C++の場合でも、std::stringはUTF-8とは関係ありません。 sizedescriptionstd::stringlength方法で我々が見ることができます:

のstd :: stringに

、要素バイト文字と同じではありません(char型のオブジェクト)が、であるかのようなマルチバイトエンコーディングUTF-8が使用されます。

したがって、サードパーティ製のユニコード互換ライブラリを使用して、ユニコード文字列を処理する必要があります。

ユニコード文字列以外の文字列クラスを引き続き使用すると、その他の問題が発生する可能性があります。たとえば、同じ外観のcombining characterprecomposed characterを比較しようとすると、偽の結果が得られます。

+0

これはとてもうまく説明します。それは、UTF8がこれを全く理解していることとは無関係の偶然です。 –

4

gccdefault input character set is UTF-8。あなたのエディタもおそらくファイルをUTF-8として保存していたので、入力.cppファイルに文字列abcdéは6バイトを持ちます(Peterがすでに答えたように、LATIN SMALL LETTER E WITH ACUTEは2バイトのUTF-8でエンコードされています)。 std::string::lengthはバイト単位の長さを返します。 6. QED

ソースの.cppファイルを16進エディタで開いて確認する必要があります。