кодировка символов в питоне - PullRequest
1 голос
/ 16 апреля 2011

У меня есть поток байтов, который выглядит такcode

file = open("test_doc","w")
file.write(str_data)
file.close()

Если в веб-браузере открыт test_doc и для японского языка установлена ​​кодировка символов, то он работает просто отлично.

Я использую reportlab для генерации pdf.используя следующий код

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase.cidfonts import CIDFont


pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','90ms-RKSJ-H'))
pdfmetrics.registerFont(CIDFont('HeiseiKakuGo-W5','90ms-RKSJ-H'))
c = Canvas('test1.pdf')
c.setFont('HeiseiMin-W3-90ms-RKSJ-H', 6)

message1 = '\202\261\202\352\202\315\225\275\220\254\226\276\222\251\202\305\202\267\201B'

message3 = '\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88';

c.drawString(100, 675,message1)
c.save()

Здесь я использую переменную message1, которая дает вывод на японском языке, мне нужно использовать message3 вместо message1 для генерации pdf.Message3 генерирует мусор, вероятно, из-за неправильного кодирования.

Ответы [ 3 ]

2 голосов
/ 16 апреля 2011

Вот ответ:

message1 закодировано в shift_jis;message3 и str_data кодируются в UTF-8.Все, кажется, представляют японский текст.См. Следующий сеанс IDLE:

>>> message1 = '\202\261\202\352\202\315\225\275\220\254\226\276\222\251\202\305\202\267\201B'
>>> print message1.decode('shift_jis')
これは平成明朝です。
>>> message3 = '\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88'
>>> print message3.decode('UTF-8')
テスト
>>>str_data = '\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
>>> print str_data.decode('UTF-8')
日本語
>>> 

Переводчик Google распознает язык как японский и переводит его на английский "Это Heisei Mincho.", "Test" и "Japanese" соответственно.

Что за вопрос?

1 голос
/ 17 апреля 2011

Если вам нужно обнаружить эти кодировки на лету, вы можете взглянуть на превосходный открытый код Mark Pilgrim Universal Encoding Detector .

#!/usr/bin/env python

import chardet 
message1 = '\202\261\202\352\202\315\225\275\220\254\226\276\222\251\202\305\202\267\201B'
print chardet.detect(message1)
message3 = '\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88'
print chardet.detect(message3)
str_data = '\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
print chardet.detect(str_data)

Выход:

{'confidence': 0.99, 'encoding': 'SHIFT_JIS'}
{'confidence': 0.87625, 'encoding': 'utf-8'}
{'confidence': 0.87625, 'encoding': 'utf-8'}
1 голос
/ 16 апреля 2011

Полагаю, вам нужно больше узнать о кодировании строк в целом. Строка в python не имеет прикрепленной информации о кодировке, поэтому вы должны правильно ее использовать или преобразовать соответствующим образом. Посмотрите на строки Unicode, методы кодирования / декодирования и модуль кодеков. И проверьте, может ли c.drawString также разрешить передавать строку в юникоде, что может значительно облегчить вашу жизнь.

...