2

生のutf-8文字列を取得しました:

u'1\u670d-\u82f1\u96c4\u96c6\u7ed3'

そして、それを文字列に変換します

s = str(u'1\u670d-\u82f1\u96c4\u96c6\u7ed3'.encode('utf8'))
print s
'1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93'    

その数字の 1 を残りの文字列と分けたいと思います。

それから私は試しました:

s.split('\\')
['1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93']

s.split('\\x')
['1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93']

私が思っていたものではありません。

最後に輝きが頭に浮かびました。

s.split('\xe6')
['1', '\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93']

しかし、問題は、他のそのような組み合わせの utf-8 コードが '\xe6' で始まることを保証できないため、数値を任意の utf-8 コードと区別して分割する方法が必要なことです。

それは可能ですか?

4

2 に答える 2

3

常に 1 桁の場合は、最初の項目にインデックスを付けます。

digit = s[0]

それ以外の場合は、正規表現を使用してスキャンできます。

number = re.match(r'^\d+', s).group(0)
于 2014-08-16T03:31:51.017 に答える
2

そこに注意してください-あなたが「生のutf-8文字列」として私たちに提示したものは、それ以上の違いはありません.

最も重要なのは、最後にあるはずですが、文字列の最終的なデコードにより、中国語で有効なフレーズが明らかになり、Google翻訳で明らかに有効な翻訳が流出します:「1ヒーロービルド」: ここに画像の説明を入力

2 つ目: 今行っていることはすべてやめて、"Joel on Software" の Unicode に関する古典的な記事を読んでください。実際には - それはあなたを良くします - タイトルがあなたを嘲笑されているように感じさせないでください - それを読んでください.

3 番目に、データの何が問題なのかを見てみましょう。そこにあるのは、「生の utf-8 文字列」ではなく、Python Unicode オブジェクトです。その特定の文字列を ut-8 に正しくエンコードすると、文字どおりに読み取られる文字列 (バイト) オブジェクトが 得'1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93' られsます。 ( \) 文字 - つまり、ここで示したスラッシュは、バイト "0xe6, 0x9c" などを文字としてエンコードするためのエスケープ シーケンスの一部として使用されていません - それらは文字通りそこにあります。それrepr'1\\xe6\\x9c\\x8d-\\xe8\\x8b\\xb1\\xe9\\x9b\\x84\\xe9\\x9b\\x86\\xe7\\xbb\\x93'

ただし、それらはエスケープ シーケンスの一部である必要があるため、(バイト) 文字列をデコードsして Unicode に戻す必要がありますが、特別な「unicode_escape」コーデックを使用すると、Unicode オブジェクトが得られます。リテラルのスラッシュは実際には、前にある 16 進バイト コードのエスケープ文字です。

>>> print s, repr(s)
1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93 '1\\xe6\\x9c\\x8d-\\xe8\\x8b\\xb1\\xe9\\x9b\\x84\\xe9\\x9b\\x86\\xe7\\xbb\\x93'
>>> s1 = s.decode("unicode_escape")
>>> print repr(s1)
u'1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93'

その Unicode オブジェクトは Unicode としては意味がありませんが、その raw バイトの内容は utf-8 の実際の最終的な文字列です:

>>> print s1
1æ-è±ééç»

「latin-1」変換は、主に偶然によるものであり、「それはそのようなものである」ためではなく、Unicode オブジェクトのバイトをそのまま通常の (バイト) 文字列に変換するためです。これは「ユニコードの問題」ではありません。Python ユニコード オブジェクトの内部表現の 0 ~ 255 の値がラテン 1 エンコーディングと一致するのは偶然によるものです。したがって、「ラテン 1」でのエンコーディングは「透明な"エンコーディング。規格にはそれを義務付けるものはありません。この文字列を UTF-8 として表示すると(NB、私は utf-8 コンソールで Python インタラクティブ インタープリターを使用しています。ラテン 1 またはその他のエンコーディングを使用した Python プロンプトでは異なる可能性があります)。この場合の意図した文字列:

>>> s2 = s1.encode("latin-1")

>>> print repr(s2)
'1\xe6\x9c\x8d-\xe8\x8b\xb1\xe9\x9b\x84\xe9\x9b\x86\xe7\xbb\x93'

>>> print s2
1服-英雄集结
于 2014-08-16T04:56:24.387 に答える