Конвертировать GB2312 в UTF-8

У меня есть текстовый файл, содержащий локализованные языковые строки, который в настоящее время закодирован в GB2312 (упрощенный китайский), но все остальные мои языковые файлы находятся в UTF-8. Мне очень трудно работать с этим файлом, так как ни один из моих текстовых редакторов не будет работать с ним должным образом и будет постоянно портить его. Есть ли инструменты для преобразования этого в UTF-8, и есть ли недостатки в этом? Будет ли лучше просто сохранить его как GB2312 и использовать другой редактор (если так, можете ли вы порекомендовать его)?

Обновление: я использую Windows XP (установка на английском языке).

Обновление № 2: я пытался использовать Notepad++ и Notepad2 для редактирования файлов GB2312, но оба не могут прочитать файлы и повредить их.

5 ответов

Решение

Вы можете попробовать этот онлайн-сервис, который использует Open Source iconv полезность.
Вы также можете установить Charco, версию командной строки, на свой компьютер.

За GB2312, ты можешь использовать CP936 в качестве кодировки.

Если вы являетесь разработчиком.Net, вы можете создать небольшой инструмент, который сделает именно это.
Я также боролся с этим и обнаружил, что на самом деле это было просто решить с программной точки зрения.

Все, что вам нужно, это что-то вроде этого (я проверил, и это работает):

В C#

static void Main(string[] args) {
    string infile = args[0];
    string outfile = args[1];

    using (StreamReader sr = new StreamReader(infile, Encoding.GetEncoding(936))) {
        using (StreamWriter sw = new StreamWriter(outfile, false, Encoding.UTF8)) {
            sw.Write(sr.ReadToEnd());
            sw.Close();
        }
        sr.Close();
    }
}

В VB.Net

Private Shared Sub Main(ByVal args() As String)
    Dim infile As String = args(0)
    Dim outfile As String = args(1)
    Dim sr As StreamReader = New StreamReader(infile, Encoding.GetEncoding(936))
    Dim sw As StreamWriter = New StreamWriter(outfile, false, Encoding.UTF8)
    sw.Write(sr.ReadToEnd)
    sw.Close
    sr.Close
End Sub

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

  1. Заменить все & от &amp;, все < от &lt; и все > от &gt; (чтобы быть на безопасной стороне)
  2. Добавьте следующее к текстовому файлу:

    <html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /></head><body><pre>

  3. Откройте файл в вашем любимом браузере

  4. Выделите и скопируйте весь текст
  5. Вставьте его в Блокнот и сохраните как UTF-8.

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

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

Если в вашей ОС есть инструмент командной строки, вы можете добиться этого, запустив однострочный скрипт:

      # From GB18030
iconv -f gb18030 -t utf8 -o output.txt input.txt

# From GB2313
iconv -f gb2313 -t utf8 -o output.txt input.txt

Проверьте, есть ли в вашей ОСiconv:

      $ iconv --version
iconv (Debian GLIBC 2.31-13+deb11u3) 2.31
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Ulrich Drepper.

GB 2312 в основном совместим с GB 18030, поэтому любой инструмент, способный справиться с последним, должен также правильно обрабатывать GB 2312. Существует много инструментов для преобразования GB 18030 в UTF-8 (или какую-либо другую форму кодирования Unicode), но я не могу рекомендовать какой-либо конкретный для Windows, потому что я работаю в Unix. Если вы хотите написать немного кода, библиотеку iconv или ICU, вы можете вспомнить: вы найдете все данные о конверсии, легко доступные в этих библиотеках.

Переход с GB 2312 на UTF-8 абсолютно безопасен и без потерь, вам не стоит об этом беспокоиться.

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

И в настоящее время Python доступен из коробки в большинстве сред Linux, а также легко устанавливается в среде Windows (проще, чем установка стека C#, ИМХО). Итак, без лишних слов, это двухстрочный скрипт Python, который может конвертировать GB2312 в UTF8. Я проверил это, это работает.

      # Usage: python this_script.py your_input.txt your_output.txt
import io, sys
io.open(sys.argv[2], "w", encoding="utf-8").write(io.open(sys.argv[1], encoding="gb2312").read())
Другие вопросы по тегам