Распечатка японских (китайских) символов - PullRequest
2 голосов
/ 28 февраля 2010

Я читаю по-японски и хочу попробовать обработать некоторый японский текст. Я попробовал это с помощью Python 3:

for i in range(1,65535):
    print(chr(i), end='')

Затем Python дал мне массу ошибок. Что пошло не так?

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~Traceback (most recent call last):
  File "C:\test\char.py", line 11, in <module>
    print(chr(i), end='')
  File "C:\Python31\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\x80' in position 0: character maps to <undefined>

Насколько я понимаю, функция chr продолжает преобразовывать числа Unicode в соответствующие японские символы. Если так, почему японские символы не выводятся? Почему происходит сбой в конце списка символов латинского алфавита?

Пожалуйста, исправьте меня, если я ошибаюсь в моем понимании того, что набор Unicode был разработан исключительно для обслуживания незападных языков.


EDIT

Я попробовал 3 строки, предложенные Джоном Мачином в IDLE, и вывод сработал!

До этого я использовал Блокнот программиста с инструментами, настроенными на захват выходных данных компилятора python.exe. Возможно, именно поэтому возникли ошибки.

Тем не менее, для большинства других вещей вывод записывается правильно; тогда почему это терпит неудачу особенно в этом процессе? Т.е. почему код работает в оболочке IDLE Python, а не через захват вывода Блокнота программиста? Разве вывод не должен быть одинаковым, независимо от интерфейса?

Ответы [ 5 ]

9 голосов
/ 01 марта 2010

Если, как вы говорите, вы читаете по-японски, вы должны знать, что японский язык написан с использованием ЧЕТЫРЕХ различных типов символов: (1) кандзи (китайские иероглифы) (2) катакана (3) хирагана (4) ромадзи («римский») буквы). Есть много десятков тысяч кандзи, из которых только несколько тысяч находятся в общем использовании.

Ваш код, если бы он работал так, как вы себе представляли, мог бы печатать не только "римские" символы, но также греческий, арабский, иврит, кириллица (используется на русском языке и т. Д.), Армянский, полдюжины или около того различные, но связанные наборы символов, используемые в Индии, многие из которых я пропустил, около 11 тысяч слогов Hangul (используется на корейском языке) и куча тарабарщины для неиспользуемых кодовых точек и (в зависимости от того, какую оболочку вы использовали в) возможно, произошел сбой при достижении 0xD800 (первый суррогат).

Чуть меньше амбиций даст вам Хирагана, Катакана и несколько "Объединенных идеографов CJK". Приведенные ниже примеры выполнялись в режиме IDLE.

>>> for i in range(0x3040, 0x30a0): print(chr(i), end='')

぀ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゗゘゙゚゛゜ゝゞゟ
>>> for i in range(0x30a0, 0x3100): print(chr(i), end='')

゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ
>>> for i in range(0x4e00, 0x4f00): print(chr(i), end='')

一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专且丕世丗丘丙业丛东丝丞丟丠両丢丣两严並丧丨丩个丫丬中丮丯丰丱串丳临丵丶丷丸丹为主丼丽举丿乀乁乂乃乄久乆乇么义乊之乌乍乎乏乐乑乒乓乔乕乖乗乘乙乚乛乜九乞也习乡乢乣乤乥书乧乨乩乪乫乬乭乮乯买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿亀亁亂亃亄亅了亇予争亊事二亍于亏亐云互亓五井亖亗亘亙亚些亜亝亞亟亠亡亢亣交亥亦产亨亩亪享京亭亮亯亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿什仁仂仃仄仅仆仇仈仉今介仌仍从仏仐仑仒仓仔仕他仗付仙仚仛仜仝仞仟仠仡仢代令以仦仧仨仩仪仫们仭仮仯仰仱仲仳仴仵件价仸仹仺任仼份仾仿

Обновление Причина, по которой у вас возникла проблема, заключается в том, что используемая оболочка / IDE предоставляет только стандартный стандартный вывод Windows GUI, для которого используется кодировка по умолчанию (у вас в лесу) cp1252 (помните упоминание о cp1252 в вашей трассировке?), которое в вашем случае подходит для ромаджи, но не более того. Альтернативы, доступные везде и без загрузок: (1) IDLE (2) записать файл, закодированный в UTF-8, и прочитать его в блокноте. Я уверен, что другие могут предложить другие IDE.

2 голосов
/ 28 февраля 2010

Ваша проблема в кодировке терминала (вывода) по умолчанию. Вероятно, латиница-1 или даже постоянный Python по умолчанию, ASCII. Они не могут кодировать японские символы (поскольку предполагается, что терминал не может их отображать).

Если ваш терминал выполняет кодировку UTF-8 (наиболее часто используемую кодировку Unicode в западном мире), вы можете либо «обмануть» Python, приняв это в качестве выходной кодировки по умолчанию, либо вы можете явно кодировать кодировку Unicode в UTF-8 с

>>>> print (chr(i).encode("UTF-8"), end='')

А что касается "исключительно", я думаю, что это неправильно. Он был создан, чтобы быть кодировкой one , чтобы связать их ... эм, извините, единственная кодировка, которая нам когда-либо понадобится. Кодировка (хорошо, это использует «кодирование» не в том смысле, в котором оно используется в определении Unicode), которое можно использовать для кодирования всех текстовых документов.

0 голосов
/ 09 февраля 2015
for i in range(0x3040, 0x30a0): print unichr(i),

Это выше для кодировки Hiragana.Вы можете использовать ту же кодировку utf-8, что и для Katakana, и для кандзи.

Имейте в виду, что средний японец использует около 2000-2500 символов кандзи.Тем не менее, китайский, вероятно, около 5000-6000.

0 голосов
/ 28 февраля 2010

Не нужно пробовать все 65536 кодов BMP. Просто используйте кодовые блоки , используемые для японского текста

0 голосов
/ 28 февраля 2010

Вы пытаетесь закодировать символ (\ x80), который не определен вашим кодеком; нет правильного отображения, поэтому charmap_encode вызывает исключение. Вы можете заключить оператор print в блок try:, затем перехватить и игнорировать исключение, чтобы печатать только те символы, которые вы можете кодировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...