Я использую сценарий оболочки для преобразования кодировки файла из ANSI в UTF-8. Я использую эту команду:

iconv -f "windows-1252" -t "UTF-8" $csvname -o $mobcsvname

Здесь csvname и mobcsvname являются переменными для хранения имен входных и выходных файлов. Сценарий выполняется без ошибок, но выходной файл остается в той же кодировке, что и исходный файл, т.е. ANSI.

Что я делаю неправильно?

1 ответ1

0

UTF-8 имеет символы переменной длины. Некоторые из них - один байт, некоторые - два и т.д. Все символы ASCII (первоначально 7-разрядные, в диапазоне от 0,127) кодируются одним байтом. Это означает, что файл, содержащий

Привет, мир

практически в любой западной кодировке уже действует UTF-8. Даже если вы попытаетесь преобразовать его, результат будет таким же. iconv не будет добавлять метку порядка байтов.

Конечно, был ли файл, чтобы содержать, скажем,

Motoröl

это еще не будет UTF-8.

Notepad++ по умолчанию очень пессимистичен: если он не встречает метку порядка байтов в начале файла или, возможно, какие-либо последовательности байтов, которые выглядят как UTF-8, он обрабатывает файл как не-UTF-8.

Это поведение можно изменить в разделе «Настройки» → «Настройки» → «Новый документ» → «Кодировка». Отметьте «Применить к открытым файлам ANSI».

Чтобы проверить, есть ли в вашем файле какие-либо символы, которые будут меняться, используйте следующий скрипт Python 3:

#!/bin/env python3

with open("INSERT FILE NAME HERE", "rb") as f:
   while 1:
      byte_s = f.read(1)
      if not byte_s:
         break
      byte = byte_s[0]
      if byte > 127:
         print("Got extended ASCII character")

Он будет читать ваш файл байт за байтом и проверять, больше ли байт 127. Если их нет, то еще раз: Ваш файл уже является допустимым UTF-8.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .