Преобразование GB2312 в UTF-8

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

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

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


person Jon Tackabury    schedule 18.12.2008    source источник
comment
Какая среда? Окна? линукс?   -  person Mark Ransom    schedule 18.12.2008
comment
Извините, это в Windows XP (английская установка).   -  person Jon Tackabury    schedule 18.12.2008
comment
Вы можете попробовать написать быструю/маленькую java-утилиту, которая считывает файл в строку как GB2312, а затем записывает его обратно как UTF-8. Это должно сработать.   -  person Jason Coco    schedule 18.12.2008


Ответы (4)


Вы можете попробовать эту онлайн-службу, которая использует утилиту с открытым исходным кодом 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
person Renaud Bompuis    schedule 19.12.2008
comment
Откуда вы знаете, что GB2312 соответствует CP936? Где я могу найти таблицу, которая связывает каждый набор символов с соответствующей кодовой страницей, чтобы иметь возможность поддерживать любой язык? - person Simón; 05.03.2018

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

  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.

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

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

person mercator    schedule 19.12.2008

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

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

person Arthur Reutenauer    schedule 18.12.2008

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

И в настоящее время 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())
person RayLuo    schedule 08.01.2021