Pythonののunicodedataモジュールを使ってUTF8のエンコード、デコードをする方法

スポンサーリンク

やあ、みんな! この記事では、PythonのUnicodeと、Unicodeの文字プロパティについて学びます。

では、はじめましょう。

スポンサーリンク

Unicode とは何ですか?

Unicodeは、各文字や記号にコードポイントと呼ばれる一意の番号を関連付けます。

世界中のすべての文字体系をサポートし、どのような言語の組み合わせでもデータの取得や結合ができるようにします。

コードポイントは16進数で0から0x10FFFFまでの整数値です。

Python で Unicode 文字を使い始めるには、string モジュールがどのように文字を解釈するかを理解する必要があります。

Python で ASCII と Unicode を解釈する方法は?

Pythonは、文字列を操作するための様々な関数やツールを含むstringモジュールを提供してくれます。

これはASCII文字セットに該当します。

import string
 
print(string.ascii_lowercase)
print(string.ascii_uppercase)
print(string.ascii_letters)
print(string.digits)
print(string.hexdigits)
print(string.octdigits)
print(string.whitespace) 
print(string.punctuation)

結果は以下の通りです。

出力:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
0123456789abcdefABCDEF
01234567
     
!"#$%&'()*+,-./:;<=>?@[]^_`{|}~

chr()組み込み関数を使って、1文字のUnicode文字列を作成することができます

これは引数として1つの整数を取り、与えられた文字のUnicodeを返します。

同様に、odr()は、1文字のUnicode文字列を入力として受け取り、コード・ポイント値を返す組み込み関数です。

chr(57344)
ord('ue000')

結果は以下の通りです。

'ue000'
57344

Pythonにおける文字コードとは?

文字列は、Unicodeのコードポイントの列です。

これらのコードポイントは、効率的に保存するためにバイト列に変換されます。

この処理を文字エンコーディングと呼びます。

UTF-8、UTF-16、ASCIIなど、多くのエンコーディングがあります。

PythonはデフォルトでUTF-8エンコードを使用します。

UTF-8エンコーディングとは何ですか?

UTF-8は、文字のエンコードに最も一般的に使用されています。

UTFはUnicode Transformation Formatの略で、「8」はエンコードに8ビットの値が使用されていることを意味します。

ラテン語に限定されるASCIIとは異なり、より多くの文字を提供し、世界中のさまざまな言語に使用できるため、ASCII(American Standard Code For Information Exchange)に取って代わったものです。

UTF-8文字セットの最初の128個のコードポイントは、ASCIIの有効な文字でもあります。

UTF-8の文字は、1バイトから4バイトまでの長さがあります。

Python の encode() 関数を使って文字を UTF-8 でエンコードします。

encode()メソッドは、任意の文字をあるエンコーディングから別のエンコーディ ングに変換します。

encode関数のシンタックスは以下の通りです。

string.encode(encoding='UTF-8',errors='strict')

パラメータ

  • エンコーディングは、python がサポートする使用するエンコーディングです。
  • エラー – さまざまなエラータイプのリストは以下のとおりです。
  • strict- デフォルトのエラーは strict で、失敗すると UnicodeDecode エラーが発生します。
  • ignore- 結果からデコード不可能なユニコードを無視します。
  • replace- デコード不能なユニコードを’?’で置き換えます。
    xmlcharrefreplace- デコード不能なユニコードの代わりにxlm文字参照を挿入します。
    backslashreplace- 復号不可能なUnicodeの代わりに、 uNNNNエスケープシーケンスを挿入します。
    namereplace- Unecodable unicodeの代わりにN{…}エスケープシーケンスが挿入されます。

Pythonでencode()関数を使ってUnicodeを使うには?

それでは、文字列のencode関数によって、Pythonでどのようにユニコード文字列を作成することができるのかを理解することに移りましょう。

1. 文字列をUTF-8エンコーディングにする

string = 'örange'
print('The string is:',string)
string_utf=string.encode()
print('The encoded string is:',string_utf)

結果を出力すると、以下の様になります。

The string is: örange
The encoded string is: b'xc3xb6range'

2. エラーパラメータを用いた符号化

ドイツ語で白を意味するweißをエンコードしてみましょう。

string = 'weiß'
 
x = string.encode(encoding='ascii',errors='backslashreplace')
print(x)
 
x = string.encode(encoding='ascii',errors='ignore')
print(x)
 
x = string.encode(encoding='ascii',errors='namereplace')
print(x)
 
x = string.encode(encoding='ascii',errors='replace')
print(x)
 
x = string.encode(encoding='ascii',errors='xmlcharrefreplace')
print(x)
 
x = string.encode(encoding='UTF-8',errors='strict')
print(x)

出力。

b'weixdf'
b'wei'
b'weiN{LATIN SMALL LETTER SHARP S}'
b'wei?'
b'weiß'
b'weixc3x9f'

Python で Unicode を扱うための uncidedata モジュール

unicodedataモジュールは、すべてのUnicode文字のプロパティを定義するUnicode Character Database (UCD)を私たちに提供してくれます。

このモジュール内で定義されたすべての関数について、その機能を説明するための簡単な例を見てみましょう。

以下の関数を使用することで、Pythonで効率的にUnicodeを使用することができます

1. unicodedata.lookup(name)

この関数は,与えられた名前で文字を検索します。

見つかった場合,対応する文字が返される。

見つからなければ,Keyerrorが発生します。

import unicodedata
    
print (unicodedata.lookup('LEFT CURLY BRACKET'))
print (unicodedata.lookup('RIGHT SQUARE BRACKET'))
print (unicodedata.lookup('ASTERISK'))
print (unicodedata.lookup('EXCLAMATION MARK'))

を結果を出力すると、以下の様になります。

{
]
*
!

2. unicodedata.name(chr[, default])

この関数は、文字chrに割り当てられた名前を文字列として返す。

名前が定義されていない場合はデフォルトが返され、そうでない場合はKeyerrorが発生します。

import unicodedata
    
print (unicodedata.name(u'%'))
print (unicodedata.name(u'|'))
print (unicodedata.name(u'*'))
print (unicodedata.name(u'@'))

結果は、以下の通りです。

PERCENT SIGN
VERTICAL LINE
ASTERISK
COMMERCIAL AT

3. unicodedata.decimal(chr[, default])

この関数は、文字chrに割り当てられている10進数値を返します。

値が定義されていない場合はデフォルトが返され、そうでない場合は以下の例のようにKeyerrorが発生します。

import unicodedata
    
print (unicodedata.decimal(u'6'))
print (unicodedata.decimal(u'b'))

を出力します。

6
Traceback (most recent call last):
  File "D:DSCrackerDS Crackerprogram.py", line 4, in <module>
    print (unicodedata.decimal(u'b'))
ValueError: not a decimal

4. unicodedata.digit(chr[, default])

この関数は、文字chrに割り当てられた桁数値を整数値で返す。

注意すべきは、この関数は1文字を入力として受け取ることです。

この例の最後の行では、”20 “を使っていますが、この関数は入力として文字列を受けつけないというエラーを投げます。

import unicodedata
    
print (unicodedata.decimal(u'9'))
print (unicodedata.decimal(u'0'))
print (unicodedata.decimal(u'20'))

出力してください。

9
0
Traceback (most recent call last):
  File "D:DSCrackerDS Crackerprogram.py", line 5, in <module>
    print (unicodedata.decimal(u'20'))
TypeError: decimal() argument 1 must be a unicode character, not str

5. unicodedata.numeric(chr[, default])

この関数は、文字chrに割り当てられた数値を整数で返します。

値が定義されていない場合はdefaultを返し、そうでない場合はValueErrorが発生します。

import unicodedata
    
print (unicodedata.decimal(u'1'))
print (unicodedata.decimal(u'8'))
print (unicodedata.decimal(u'123'))

を出力します。

1
8
Traceback (most recent call last):
  File "D:DSCrackerDS Crackerprogram.py", line 5, in <module>
    print (unicodedata.decimal(u'123'))
TypeError: decimal() argument 1 must be a unicode character, not str

6. unicodedata.category(chr)

この関数は、文字chrに割り当てられた一般的なカテゴリを文字列として返す。

文字が大文字の場合は’u’、小文字の場合は’l’を返す。

import unicodedata
    
print (unicodedata.category(u'P'))
print (unicodedata.category(u'p'))

結果を出力すると、以下の様になります。

Lu
Ll

7. unicodedata.bidirectional(chr)

この関数は、文字chrに割り当てられている双方向性クラスを文字列で返します。

そのような値が定義されていない場合、この関数は空文字列を返す。

ALはアラビア文字、ANはアラビア数字、Lはleft to rightなどを表す。

import unicodedata
    
print (unicodedata.bidirectional(u'u0760'))
 
print (unicodedata.bidirectional(u'u0560'))
 
print (unicodedata.bidirectional(u'u0660'))

結果を出力すると、以下の様になります。

出力:

AL
L
AN

8. unicodedata.combining(chr)

この関数は、与えられた文字chrに割り当てられた正規の結合クラスを文字列として 返す。

結合クラスが定義されていない場合は0を返す。

import unicodedata
    
print (unicodedata.combining(u"u0317"))

出力。

出力:

220

9. unicodedata.mirrored(chr)

この関数は、与えられた文字chrに割り当てられたmirrorredプロパティを整数で返す。

その文字が双方向テキストで’mirrored’と認識されていれば1を、そうでなければ0を返します。

import unicodedata
    
print (unicodedata.mirrored(u"u0028"))
print (unicodedata.mirrored(u"u0578"))

を結果を出力すると、以下の様になります。

出力:

1
0

10. unicodedata.normalize(form, unistr)

この関数を使用すると、Unicode文字列unistrの従来のフォームを返します。

form の有効な値は ‘NFC’, ‘NFKC’, ‘NFD’, および ‘NFKD’ です。

from unicodedata import normalize
    
print ('%r' % normalize('NFD', u'u00C6'))
print ('%r' % normalize('NFC', u'Cu0367'))
print ('%r' % normalize('NFKD', u'u2760'))

結果を出力すると、以下の様になります。

'Æ'
'Cͧ'
'❠'

まとめ

この記事では、unicodeと、unicodeの特性を定義するunicodedatabaseモジュールについて学びました。

みなさんが楽しんでくれることを願っています。

ご期待ください。

参考文献

ユニコード公式ドキュメント

ユニコードデータベース

タイトルとURLをコピーしました