Linux システムでは、ファイル システムはバイトを格納し、バイトのみを格納します。
したがって、あるプログラムがファイル名を、たとえば、
UTF-16
またはISO-8859-7
エンコードして送信する必要があると判断した場合、「Νικόλαος」のような文字列を受け取り、ファイル システムは次のようなバイトを認識します。
py> s = 'Νικόλαος'
py> s.encode('UTF-16be')
b'\x03\x9d\x03\xb9\x03\xba\x03\xcc\x03\xbb\x03\xb1\x03\xbf\x03\xc2'
py> s.encode('iso-8859-7')
b'\xcd\xe9\xea\xfc\xeb\xe1\xef\xf2'
同じ文字列でもまったく異なるバイトが得られることに注意してください。同様に、使用するエンコーディングに応じて、同じバイトでも異なる文字列が得られます。
ここで、UTF-8 を予期するプログラムを使用してファイル名を読み取ろうとすると、ある種の文字化け文字が表示されるか、何らかのエラーが発生します。
py> s.encode('UTF-16be').decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9d in position 1:
invalid start byte
py> s.encode('iso-8859-7').decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcd in position 0:
invalid continuation byte
そのディレクトリには、python3 で UTF-8 としてデコードされたときにバイトとしてのファイル名が無効なファイルがいくつかありますが、私のシステムは UTF-8 を使用するように設定されています。したがって、これを修正するには、エンコーディングをあまり気にしないツールを使用してファイルの名前を変更する必要があります。
だから私は試しました:
mv 'Euxi tou Ihsou.mp3' 'Euxi tou Ihsou.mp3' 'Euxi tou Ihsou.mp3' 'Euxi tou Ihsou.mp3'
string = 'Ευχή του Ιησού.mp3'
above string in unknown charset bytes = '\305\365\367\336\364\357\365\ \311\347\363\357\375.mp3'
では、files.py がギリシャ語のファイル名を適切に読み取れるようにするには、次のコードをどのように記述する必要があるのでしょうか。
# Compute a set of current fullpaths
fullpaths = set()
path = "/home/nikos/public_html/data/apps/"
for root, dirs, files in os.walk(path):
for fullpath in files:
fullpaths.add( os.path.join(root, fullpath) )
# Load'em
for fullpath in fullpaths:
try:
# Check the presence of a file against the database and insert if it doesn't exist
cur.execute('''SELECT url FROM files WHERE url = %s''', (fullpath,) )
data = cur.fetchone()
Encoding = string -> (何らかの文字セットが使用されている) -> charset bytes Decoding = bytes -> (使用されている文字セットを知る必要がある) -> 元の文字列
エンコード/デコードプロセス全体の鍵は、使用する/使用する必要がある文字セットであることを正しく理解しましたか?
key(charset) が使用されていることはわかりませんが、文字列の元の形式はわかっているため、mojabike バイトストリームを利用可能なすべての文字セットにデコードする Python スクリプトを作成すると、ある時点で元の文字列が戻ってきます。