0

これは初心者の質問かもしれませんが、ここに行きます。ASCII 文字と非 ASCII 文字の両方を含む大きなサイズstring(167572 バイト) があります。ASCII文字列で使用するlen()と、間違ったlength. len()0x0A 文字をカウントしないようです。文字列の実際の長さを取得できる唯一の方法は、次のコードを使用することです。

for x in test:  
   totalLen += 1   
for x in test:  
   if x == '\x0a':  
      totalLen += 1  
print totalLen  

の何が問題になっていlen()ますか? それとも私の使い方が悪いのでしょうか?

4

2 に答える 2

6

エンコードされたバイト文字列をUnicodeテキストと混同しています。たとえば、UTF-8では、任意の文字をエンコードするために最大3バイトが使用されますが、UTF-16では、各文字はそれぞれ少なくとも2バイトを使用してエンコードされます。

Python文字列は一連のバイトであり、Unicodeを取得するには、適切なコーデックで文字列をデコードする必要があります。たとえば、テキストがUTF-8を使用してエンコードされている場合は、次のコマンドでデコードできます。

test = test.decode('utf8')

一方、ファイルに書き込まれるデータは常にエンコードされるため、UTF-16コーデックを使用して書き込まれる場合、長さ10のUnicode文字列はファイル内で20バイトを占める可能性があります。

\n(ASCII 10)文字が正しくカウントされているかどうかではなく、そのような「幅の広い」文字と混同されている可能性があります。

どうぞよろしくお願いし、Unicodeとエンコーディングについて読んでください。

于 2012-11-16T14:48:38.523 に答える
4

ASCII 13 (キャリッジ リターン) の後に ASCII 10 (ライン フィード)が含まれていることを期待している\r\nのか、テキスト ファイルに書き出された文字列を調べて、これらを追加するのでしょうか?

文字列のデータがどこから来たのかなど、多くの詳細を提供しないため、特定するのは困難です。

于 2012-11-16T14:46:29.520 に答える