2017-01-11 4 views
-1

Я хочу, чтобы кодировать CSV файл из ASCII в кодировке UTF8, и это код, который я попробовал:закодировать файл из ASCII в UTF8

import codecs 
import chardet 
BLOCKSIZE = 9048576 # or some other, desired size in bytes 

with codecs.open("MFile2016-05-22.csv", "r", "ascii") as sourceFile: 
    with codecs.open("tmp.csv", "w", "utf-8") as targetFile: 
     while True: 
      contents = sourceFile.read(BLOCKSIZE) 
      if not contents: 
       break 
      targetFile.write(contents) 


file = open("tmp.csv", "r") 
try: 
    content = file.read() 
finally: 
    file.close() 
     encoding = chardet.detect(content)['encoding'] 
print encoding 

После тестирования, я все еще получаю «ASCII» в значение кодирования. Кодировка не изменилась. Что мне не хватает?

+1

Любой файл ASCII уже действует UTF -8. Фактически, он действителен практически во всех кодировках (которые основаны на ASCII). – deceze

ответ

0

ASCII - это подмножество UTF-8. Любой ASCII-кодированный файл также действителен UTF-8.

От Wikipedia article on UTF-8:

Первые 128 символов Unicode, которые соответствуют один к одному с ASCII, кодируются с использованием одного октета с тем же двоичным значением, как ASCII, так что действительный текст ASCII также является Юникодом с кодировкой UTF-8.

Других слов, ваша операция не-оп, ничего должен изменение.

Любые инструменты, которые обнаруживают кодеки (например, chardet), по праву будут отмечать его как ASCII. Маркировка его как UTF-8 также будет действительна, но это означало бы ее как ISO-8859-1 (Latin-1) или CP-1252 (кодовая страница на основе латинского языка Windows) или любое количество кодеков, которые являются надмножествами ASCII. Это было бы запутанно, однако, поскольку ваши данные состоят только из кодовых точек ASCII. Инструменты, которые принимают ASCII , только будут принимать ваш CSV-файл, в то время как они не будут принимать данные UTF-8, которые состоят из более чем кодовых точек ASCII.

Если цель состоит в том, чтобы подтвердить, что любой фрагмент текста действует UTF-8 с помощью chardet, то вы должны будете принять ASCII тоже:

def is_utf8(content): 
    encoding = chardet.detect(content)['encoding'] 
    return encoding in {'utf-8', 'ascii'} 
+0

Можно ли показать в результатах теста utf-8 вместо ASCII? – JavaQueen

+0

@Cloudgls: какой результат теста? Вы не показали нам, что вы используете для тестирования. И обратите внимание, что «Latin-1» также будет действительным, как CP-1252. ASCII используется в качестве основы для многих кодировок. Текст, который использует только кодовые точки ASCII, лучше всего помечен как ASCII, а не как один из многих надмножеств. –

+0

результат 'print encoding' – JavaQueen

0

ASCII - это подмножество UTF-8; все файлы ASCII также автоматически являются UTF-8. Вам не нужно ничего делать.

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