Как поменять кодировку файла c

Обновлено: 07.07.2024

Кодировка текста – это схема нумерации символов, в которой каждому символу, цифре или знаку присвоено соответствующее число. Кодировку используют для сохранения и обработки текста на компьютере. Каждый раз при сохранении текста в файл он сохраняется с использованием определенной схемы кодирования, и при открытии этого файла необходимо использовать такую же схему, иначе восстановить исходный текст не получится. Самыми популярными кодировками для кириллицы сейчас являются UTF-8, Windows-1251 (CP1251, ANSI).

Для того чтобы программа смогла правильно открыть текстовый файл, иногда приходится вручную менять кодировку, перекодируя текст из одной схемы в другую. Например, не редко возникают проблемы с открытием файлов CSV, XML, SQL, TXT, PHP.

В этой небольшой статье мы расскажем о том, как изменить кодировку текстового файла на UTF-8, Windows-1251 или любую другую.

Блокнот Windows

Если вы используете операционную систему Windows 10 или Windows 11, то вы можете изменить кодировку текста с помощью стандартной программы Блокнот. Для этого нужно открыть текстовый файл с помощью Блокнота и воспользоваться меню « Файл – Сохранить как ».

меню Файл – Сохранить как

В открывшемся окне нужно указать новое название для файла, выбрать подходящую кодировку и нажать на кнопку « Сохранить ».

изменить кодировку в Блокноте

К сожалению, для подобных задач программа Блокнот часто не подходит. С ее помощью нельзя открывать документы большого размера, и она не поддерживает многие кодировки. Например, с помощью Блокнота нельзя открыть текстовые файлы в DOS 866.

Notepad++

Notepad++ (скачать) является одним из наиболее продвинутых текстовых редакторов. Он обладает подсветкой синтаксиса языков программирования, позволяет выполнять поиск и замену по регулярным выражениям, отслеживать изменения в файлах, записывать и воспроизводить макросы, считать хеш-сумы и многое другое. Одной из основных функций Notepad++ является поддержка большого количества кодировок текста и возможность изменения кодировки текстового файла в UTF-8 или Windows 1251.

Для того чтобы изменить кодировку текста с помощью Notepad++ файл нужно открыть в данной программе. Если программа не смогла правильно определить схему кодирования текста, то это можно сделать вручную. Для этого нужно открыть меню « Кодировки – Кириллица » и выбрать нужный вариант.

выбрать кодировку в Notepad++

После открытия текста можно изменить его кодировку. Для этого нужно открыть меню « Кодировки » и выбрать один из вариантов преобразования. Notepad++ позволяет изменить текущую кодировку текста на ANSI (Windows-1251), UTF-8, UTF-8 BOM, UTF-8 BE BOM, UTF-8 LE BOM.

изменить кодировку в Notepad++

После преобразования файл нужно сохранить с помощью меню « Файл – Сохранить » или комбинации клавиш Ctrl-S.

Akelpad

Akelpad (скачать) – достаточно старая программа для работы с текстовыми файлами, которая все еще актуальна и может быть полезной. Фактически Akelpad является более продвинутой версией стандартной программы Блокнот из Windows. С его помощью можно открывать текстовые файлы большого размера, которые не открываются в Блокноте, выполнять поиск и замену с использованием регулярных выражений и менять кодировку текста.

Для того чтобы изменить кодировку текста с помощью Akelpad файл нужно открыть в данной программе. Если после открытия файла текст не читается, то нужно воспользоваться меню « Файл – Открыть ».

открыть файл в Akelpad

В открывшемся окне нужно выделить текстовый файл, снять отметку « Автовыбор » и выбрать подходящую кодировку из списка. При этом в нижней части окна можно видеть, как будет отображаться текст.

выбрать кодировку в Akelpad

Для того чтобы изменить текущую кодировку текста нужно воспользоваться меню « Файл – Сохранить как » и сохранить документ с указанием новой схемы кодирования.

изменить кодировку в Akelpad

В отличие от Notepad++, текстовый редактор Akelpad позволяет сохранить файл в практически любой кодировке. В частности, доступны Windows 1251, DOS 886, UTF-8 и многие другие.

Я пытаюсь открыть существующий файл и прочитать его, например:

Тогда я хочу изменить string кодирует в UTF-8 и сохраняет его.

Итак, мне нужно два API:

Найти существующую кодировку файла.

Преобразовать данные из вышеуказанной кодировки в UTF-8.

Я искал Google и StackOverflow, но не могу найти идеальное решение.

Может кто-нибудь поделиться со мной некоторыми намеками?

Решение

Шаг № 1 очень сложно выполнить, если файл еще не использует кодировку UTF, например UTF-8 или UTF-16 (UTF-8 очень легко обнаружить, а UTF-16 также довольно легко в некоторой степени, если спецификация отсутствует) ,

В мире используется МНОГИЕ кодировки (Unicode был разработан, чтобы заменить их всех, но эта цель еще не достигнута на 100% в глобальном масштабе), и многие кодировки не-ASCII не могут точно быть обнаружены без контекста или предварительного знания кодировки, которая использовалась для создания файла. Если вы не можете попросить пользователя указать конкретную кодировку, вам придется прибегнуть к эвристическому анализу данных (и есть некоторые сторонние библиотеки обнаружения кодировок, если вы будете искать вокруг), и это подвержено ошибкам без контекстной информации.

Без контекста одни и те же данные могут интерпретироваться по-разному, давая разные результаты. Например, такая проблема затрагивает нечто такое же «простое», как Notepad в Windows, когда нужно угадать кодировку файла. Это хороший пример того, как угадывание может пойти не так:

Независимо от того, насколько хорошей может быть ваша эвристика, вы все равно догадаетесь, и гадание не на 100% надежно Так что сделайте себе одолжение и вообще не догадывайся.

Что касается шага № 2, после того как вы определили исходную кодировку, вы должны использовать переносимую библиотеку Unicode для преобразования из этой кодировки в UTF-8, такую ​​как libiconv или же ICU .

Другие решения

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

Отдельные операционные системы могут предоставлять специфичные для файла метаданные, которые определяют, какой тип содержимого в файле; например, какую кодировку использует текстовый файл.

Но в стандартной библиотеке C ++ нет ничего, что возвращало бы произвольную кодировку файла.

Я хочу прочитать текстовый файл, который содержит информацию о его кодировке в его содержании. Я не знаю, какая кодировка используется, прежде чем я прочитал файл. Я использую System.IO.File.ReadAllText для чтения файла. Как я могу преобразовать кодировку, не читая файл снова?

Я пытался указать кодировку по умолчанию при чтении файла и затем преобразовать его в окончательную кодировку, но он не конвертируется правильно:

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

3 ответа

Используйте System.IO.File.ReadAllBytes для чтения файла, а затем расшифруйте байтовый массив после того, как вы знаете, какая кодировка вам нужна, используя что-то вроде: System.Text.Encoding.XXXX.GetString()

Я не знаю, какая кодировка используется, прежде чем я прочитал файл.

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

Если нет, вот несколько распространенных методов:

  1. Ищите спецификацию Unicode в первых нескольких байтах. Вы можете сделать это, сначала прочитав первые 5 байтов из файла в буфер (или 64-разрядное целое число) и просмотрев их в словаре. Это то, что System.IO.StreamReader делает по умолчанию.
  2. Вы можете просмотреть список известных последовательностей байтов спецификации здесь: https://en.wikipedia.org / wiki / Byte_order_mark
  3. Обратите внимание, что в UTF-8 нет спецификации, но многие редакторы (ну, в общем, Visual Studio) будут придерживаться 0xEF 0xBB 0xBF в начале).
  4. Если это text/* - семейство форматов файлов, с кодировкой, объявленной в каком-то заголовке, то вы можете прочитать первый килобайт файла в буфер и интерпретировать каждый последующий байт, оцененный в 0x7F , как символ в строке ASCII, затем используйте простой синтаксический анализатор (даже String.IndexOf ) или регулярное выражение для поиска разделителя вашего заголовка.
  5. Этот метод часто используется для файлов HTML, где заголовок HTTP, объявляющий кодировку, недоступен, и программе необходимо найти <meta http-equiv="Content-Type" /> , чтобы получить имя кодировки.

Я использую System.IO.File.ReadAllText для чтения файла. Как я могу преобразовать кодировку, не читая файл снова?

Вы не Используйте ReadAllText только для простых text/plain файлов с непротиворечивой и известной кодировкой - для этого сценария еще вам понадобится Stream и StreamReader (и, возможно, BinaryReader ) все вместе.

Символы ? или � являются символами замены ошибки преобразования, возвращаемыми при попытке прочитать текст с использованием неправильной кодовой страницы. Невозможно восстановить исходный текст из них.

Наконец, оба файла файл .ReadAllText и Используемый им класс StreamReader будет пытаться определить кодировку из спецификации файла (метки порядка байтов) и вернуться к UTF8, если спецификация не найдена.

Обнаружение кодовых страниц

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

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

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

можно ли декодировать данные правильно или они теряются при перекодировании?

какие инструменты я могу использовать?

вот пример того, что у меня есть:

Я могу сказать из контекста (café должно быть café), что это должны быть эти два символа:

EDIT: простая возможность устранить, прежде чем переходить к более сложным решениям: вы пытались установить набор символов в utf8 в текстовом редакторе, в котором Вы читаете файл? Это может быть просто случай, когда кто-то отправляет вам файл utf8, который Вы читаете в редакторе, чтобы сказать cp1252.

просто взяв два примера, это случай, когда utf8 читается через объектив однобайтовой кодировки, вероятно, один из iso-8859-1, iso-8859-15 или cp1252. Если вы может размещать примеры других проблемных символов, должно быть возможно сузить это больше.

поскольку визуальный осмотр символов может вводить в заблуждение, вам также нужно будет посмотреть на базовые байты: § вы видите на экране, может быть 0xa7 или 0xc2a7, и это определит вид преобразования набора символов, который вам нужно сделать.

можно предположить, что все ваши данные были искажены точно так же - что он пришел из того же источника и ушел через ту же последовательность преобразований, так что, например, в вашем тексте нет ни одного é, это всегда ç? Если это так, проблема может быть решена с помощью последовательности преобразований набора символов. Если вы можете быть более конкретным о среде, в которой вы находитесь, и базе данных, которую вы используете, кто-то здесь, вероятно, может сказать вам, как выполнить соответствующее преобразование.

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

выполните следующие действия с помощью Notepad++

1-скопировать исходный текст

2-в Notepad++ откройте новый файл, измените кодировку - > выберите кодировку, которую вы считаете исходным текстом. Попробуйте также кодировку "ANSI", так как иногда файлы Unicode читаются как ANSI некоторыми программами

4-затем преобразовать в Unicode, перейдя снова через то же меню: Encoding - > " Encode in UTF-8 "(не "конвертировать в UTF-8") и, надеюсь, он станет читаемый

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

большинство языков существует в 2 формах кодирования: 1 - старая форма ANSI (ASCII), только 8 бит, первоначально использовалась большинством компьютеров. 8 бит допускали только 256 возможностей, 128 из них, где обычные латинские и контрольные символы, последние 128 бит были прочитаны по-разному в зависимости от языковых настроек ПК 2 - новый стандарт Unicode (до 32 бит) дает уникальный код для каждого символа на всех известных в настоящее время языках и многое другое. если файл является unicode, его следует понимать на любом ПК с установленным шрифтом языка. Обратите внимание, что даже UTF-8 идет до 32 бит и так же широк, как UTF-16 и UTF-32 только он пытается остаться 8 бит с латинскими символами, чтобы сэкономить место на диске

когда вы видите последовательности символов, такие как ç и é, это обычно указывает на то, что файл UTF-8 был открыт программой, которая считывает его как ANSI (или аналогичный). Символы юникода, такие как:

U + 00C2 Латинская заглавная буква A с окружностью
U + 00C3 Латинская заглавная буква A с Тильдой
U + 0082 перерыв разрешен здесь
U + 0083 нет перерыва здесь

Как правило, отображаются в тексте ANSI из-за стратегии переменных байтов, которую использует UTF-8. Этот стратегия объясняется очень хорошо здесь.

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

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

Я хочу прочитать текстовый файл, который содержит информацию о его кодировке в его содержании. Я не знаю, какая кодировка используется, прежде чем я прочитал файл. Я использую System.IO.File.ReadAllText для чтения файла. Как я могу преобразовать кодировку, не читая файл снова?

Я пытался указать кодировку по умолчанию при чтении файла и затем преобразовать его в окончательную кодировку, но он не конвертируется правильно:

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

3 ответа

Используйте System.IO.File.ReadAllBytes для чтения файла, а затем расшифруйте байтовый массив после того, как вы знаете, какая кодировка вам нужна, используя что-то вроде: System.Text.Encoding.XXXX.GetString()

Я не знаю, какая кодировка используется, прежде чем я прочитал файл.

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

Если нет, вот несколько распространенных методов:

  1. Ищите спецификацию Unicode в первых нескольких байтах. Вы можете сделать это, сначала прочитав первые 5 байтов из файла в буфер (или 64-разрядное целое число) и просмотрев их в словаре. Это то, что System.IO.StreamReader делает по умолчанию.
  2. Вы можете просмотреть список известных последовательностей байтов спецификации здесь: https://en.wikipedia.org / wiki / Byte_order_mark
  3. Обратите внимание, что в UTF-8 нет спецификации, но многие редакторы (ну, в общем, Visual Studio) будут придерживаться 0xEF 0xBB 0xBF в начале).
  4. Если это text/* - семейство форматов файлов, с кодировкой, объявленной в каком-то заголовке, то вы можете прочитать первый килобайт файла в буфер и интерпретировать каждый последующий байт, оцененный в 0x7F , как символ в строке ASCII, затем используйте простой синтаксический анализатор (даже String.IndexOf ) или регулярное выражение для поиска разделителя вашего заголовка.
  5. Этот метод часто используется для файлов HTML, где заголовок HTTP, объявляющий кодировку, недоступен, и программе необходимо найти <meta http-equiv="Content-Type" /> , чтобы получить имя кодировки.

Я использую System.IO.File.ReadAllText для чтения файла. Как я могу преобразовать кодировку, не читая файл снова?

Вы не Используйте ReadAllText только для простых text/plain файлов с непротиворечивой и известной кодировкой - для этого сценария еще вам понадобится Stream и StreamReader (и, возможно, BinaryReader ) все вместе.

Символы ? или � являются символами замены ошибки преобразования, возвращаемыми при попытке прочитать текст с использованием неправильной кодовой страницы. Невозможно восстановить исходный текст из них.

Наконец, оба файла файл .ReadAllText и Используемый им класс StreamReader будет пытаться определить кодировку из спецификации файла (метки порядка байтов) и вернуться к UTF8, если спецификация не найдена.

Обнаружение кодовых страниц

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

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

Читайте также: