Java - Как проверить, правильно ли закодированы тайские символы от UTF-8 до TIS620 - PullRequest
1 голос
/ 01 октября 2019

Получите входную строку в UTF-8, я применил кодировку TIS620 и создал новую строку из нее, как сохранить байты? так как UTF-8 представляет тайский символ в 3 байта, где как TIS620 в 1 байте. У меня есть требование, когда внутренняя система хранит символы в строке только в 1 байт, поэтому по умолчанию UTF-8 разбивает его.

  1. Как преобразовать кодировку символов String из UTF-8 в TIS620?
  2. Как сохранить размер байта при передаче его бэкэнд-системе?
  3. Если строка переназначается новой строке, сохраняется ли кодировка символов или она снова преобразуется в UTF-16 (по умолчанию Java)?
  4. Возможно ли это на Java? Любая библиотека / утилита, которая может быть интегрирована?

Я попробовал приведенный ниже код и могу проверить, что после TIS620 число байтов соответствует числу символов, т.е. 1 байт / символ. Но если encodedString получит новое строковое назначение, потеряет ли он формат TIS620?

( Конвертировать строку с кодировкой UTF-8 в TIS620 (тайское кодирование) в Java. Какие есть способы сделать это, и есть липотеря данных? )

public String encode() {
        try {
String input = " "ใบใบใบใบ"";
            byte [] encodedBytes= input.getBytes("TIS620");
            String encodedString = new String(encodedBytes,"TIS620");
            }catch (UnsupportedEncodingException e){
            //Encoding failed           
        }
    }

Ожидаемый результат: если я преобразую 5 тайских символов из формата UTF-8 в TIS620, число байтов должно быть преобразовано и сохранено с 15 (UTF-8) до 5(TIS620)

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

A String в Java всегда кодируется в UTF-16, независимо от того, как он был построен. Или по-другому: как только у вас есть объект String, вам не нужно заботиться о том, какая у него кодировка. Кодировка возвращается к изображению только тогда, когда вы хотите вернуться к byte[] (или OutputStream или тому подобное).

Это правильно и почти наверняка именно то, что вы хотите сделать. Вы не должны пытаться обойти этот факт.

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

Другими словами:

  1. A String объект в Java не может кодировка "есть TIS620". A byte[] может содержать данные в кодировке TIS620, и вы создаете их из String с использованием .getBytes("TIS620").
  2. Если вы передадите закодированный byte[] в другую систему, он будетиметь правильный размер байта просто потому, что он был создан с правильной кодировкой.
  3. String всегда использует UTF-16. Создание String с содержимым «ใบ ใบ ใบ ใบ» из данных UTF-8 и из данных TIS620 приведет к созданию абсолютно идентичных объектов String, и невозможно узнать, какая кодировка использовалась для их создания.
  4. InputStreamReader, OutputStreamWriter и сопоставимые классы также могут передаваться кодированием для декодирования / кодирования с этим кодированием соответственно. Кроме этого, никакой специальной обработки не требуется.
0 голосов
/ 01 октября 2019

Типы текстовых данных Java (String, char и Character) - то же самое касается .NET, JavaScript, VB4 / 5/6 / A / Script,…) всегда используют кодировку UTF-16 символовНабор символов Unicode.

Многие интерфейсы, привязки, драйверы, адаптеры данных и все, что не понимают, понимают, что тип данных text - это UTF-16 и какой символьный кодировщик нужен для целевого объекта, а также для самого преобразования. Пока вы используете типы данных Java, если у вас есть кодировка текста как UTF-8 или TIS620, вы обычно используете байтовый массив.

Что это за простой текст как текст.

Теперь, если у вас есть массив произвольных байтов, и вы хотите записать его в текстовый контекст, вы можете использовать Base64. Такая функция принимает массив байтов и возвращает строку (конечно, в кодировке UTF-16). Но так как используемые символы поддерживаются каждым набором символов, не будет потери данных для преобразования данных в любое другое кодирование.

Людям нравится иметь дело с типами текстовых данных, поэтому приведенная выше схема великолепна. Но почему-то вместо Base64 некоторые люди используют то, что я называю Base256. У них есть массив байтов (очень часто создаваемый из кодировки текста с кодировкой символов), и они применяют функцию кодирования для преобразования байтов в текст, выбирая кодирование путем декодирования с кодировкой символов. Вам необходимо определить, имеете ли вы с этим дело, и если да, то какая кодировка символов была выбрана в качестве кодировки Base256. (Часто для этого используется кодировка ISO 8859-1.)

...