2016-04-15 3 views
2

В Python, для японского, китайского и корейского языков, Python не может печатать правильные строки, например hello в японском, корейском и китайском языках:Python, как печатать японский, корейский, китайский строк

こんにちは 
안녕하세요 
你好 

и напечатать эти строки:

In [1]: f = open('test.txt') 

In [2]: for _line in f.readlines(): 
    ...:  print(_line) 
    ...:  
こんにちは 

안녕하세요 

你好 


In [3]: f = open('test.txt') 

In [4]: print(f.readlines()) 
[ '\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf\n', '\xec\x95\x88\xeb\x85\x95\xed\x95\x98\xec\x84\xb8\xec\x9a\x94\n', '\xe4\xbd\xa0\xe5\xa5\xbd\n'] 

In [5]: a = '你好' 

In [6]: a 
Out[6]: '\xe4\xbd\xa0\xe5\xa5\xbd' 

Мой Python версии 2.7.11 и ОС Ubuntu 14,04

Как обрабатывать эти '\xe4\xbd\xa0\xe5\xa5\xbd\n' строки.

Спасибо!

+0

Идите по файлу и распечатайте отдельные элементы. 'для строки в f.readlines(): print line' – letmutx

+0

У меня не было проблем с печатью. В [5]: print (f.readlines()) ['こ ん に ち は \ n'] – Hun

+0

Что вы понимаете, обрабатывая эти строки? – letmutx

ответ

3

Сначала нужно прочитать текст в Юникоде

import codecs 
f = codecs.open('test.txt','r','utf-8') 

Второй

При печати вы должны кодировать его, как это

unicodeText.encode('utf-8') 

Третий

вы должны убедиться, что консоль поддерживает отображение Unicode

Использование

print sys.getdefaultencoding() 

, если он не попробовать

reload(sys) 
sys.setdefaultencoding('utf-8') 
0

Попробуйте это:

import codecs 

fp = codecs.open('test.txt', encoding='utf-8') 

for line in fp: 
    print line 
1

Мой питон версия 2.7.11 и операционная система Mac OSX, я пишу

こんにちは 
안녕하세요 
你好 

to test.txt. Моя программа:

# -*-coding:utf-8-*- 

import json 


if __name__ == '__main__': 
    f = open("./test.txt", "r") 
    a = f.readlines() 
    print json.dumps(a, ensure_ascii=False) 
    f.close() 

запустить программу, результат:

["こんにちは\n", "안녕하세요\n", "你好"] 
+0

Это совсем не тот случай. Вы пишете строковое представление JSON в списке Python, а не в самом списке. –

+1

Я пытаюсь каким-то образом, если вы хотите получить данные типа списка, данные печати в списке должны быть экранированы. Вы знаете, как печатать данные списка без экранирования? –

1

То, что вы видите, разница между

  1. Печать строки
  2. Печать списка

Или более общий а также различие между объектами «неформальное» и «официальное» строковое представление (see documentation).

В первом случае строка юникода будет напечатана правильно, как и следовало ожидать, с символами юникода.

Во втором случае элементы списка будет напечатаны с использованием их представления, а не их строкового значения.

for line in f.readlines(): 
    print line 

является первым (хорошо) случай, и

print f.readlines() 

второй случай.

Вы можете проверить разницу в этом примере:

a = u'ð€œłĸªßð' 
print a 
print a.__repr__() 
l = [a, a] 
print l 

Это показывает разницу между специальными __str__() и __repr__() методы, которые вы можете играть с самим собой.

class Person(object): 
    def __init__(self, name): 
     self.name = name 
    def __str__(self): 
     return self.name 
    def __repr__(self): 
     return '<Person name={}>'.format(self.name) 

p = Person('Donald') 
print p # Prints 'Donald' using __str__ 
p # On the command line, prints '<Person name=Donald>' using __repr__ 

есть, значение, которое вы видите, когда просто введя имя объекта на консоли определяется __repr__ а то, что вы видите, когда вы используете print определяется __str__.

+0

OP использует Python3, ваше обсуждение о поведении Python2. – gboffi

+0

@gboffi: Мы уверены в этом? Вы добавили тег Python-3, а не OP. Функция print-as-a указывает на Python 3, но поскольку он мог использовать 'from __future__ ...', мы не можем быть на 100% уверены. Я мог бы воспроизвести проблему OP, если не использовать Python 2. –

+0

спасибо, My Python версия 2.7.11 –

Смежные вопросы