2017-05-10 18 views
2

すべてのutf8文字リストを生成したい。 私は以下のコードを書いたが、うまくいかなかった。 chr()はユニコード番号を期待していると思いますが、utf8コード番号を付けました。 私はutf8コード番号をユニコードコード番号に変換しなければならないと思いますが、その方法はわかりません。 どうすればいいですか?それとも良い方法を知っていますか?Python3でutf8コード番号をユニコードコード番号に変換する方法

def utf8_2byte(): 
    characters = [] 
    # first byte range: [C2-DF] 
    for first in range(0xC2, 0xDF + 1): 
     # second byte range: [80-BF] 
     for second in range(0x80, 0xBF + 1): 
      num = (first << 8) + second 
      line = [hex(num), chr(num)] 
      characters.append(line) 
    return characters 

は私が期待して:

実際
# UTF8 code number, UTF8 character 
[0xc380,À] 
[0xc381,Á] 
[0xc382,Â] 

ます:python 3では

[0xc380,쎀] 
[0xc381,쎁] 
[0xc382,쎂] 

答えて

2

chrutf-8は、Unicodeのコードポイントを取りません。 U+C380はハングル範囲です。代わりに、あなたは他の方法がstructか​​のように、もありますデコード用bytearray

>>> bytearray((0xc3, 0x80)).decode('utf-8') 
'À' 

を使用することができます。ネイティブバイトをアセンブルしてbytesに変換するものはすべて行います。

+0

ありがとうございます。私は理解した。 Unicode 'U + c380'はコードポイントです。 '1100001110000000'(0xc380)は、UnicodeコードポイントからUTF-8エンコーディングスタイルを使ってデコードされたbytearrayです。 コードはうまくいきました。どうもありがとうございました。 –

2

Unicodeは文字セットですが、UTF-8はUnicodeからマシンレベルのバイトまでコードポイントをエンコードするアルゴリズムであり、その逆もあります。

コードポイント0xc380は、Unicodeの標準でです。

バイト0xc380は、UTF-8エンコーディングを使用してデコードするとÀになります。

>>> s = "쎀" 
>>> hex(ord(s)) 
'0xc380' 
>>> b = bytes.fromhex("C3 80") 
>>> b 
b'\xc3\x80' 
>>> b.decode("utf8") 
'À' 
>>> bytes((0xc3, 0x80)).decode("utf8") 
'À' 
+0

ありがとうございました。私は 'bytes()'と 'decode()'メソッドを使います。 –

関連する問題