Как записать данные, созданные в кодировке UTF8, в файл как кодировку Shift-JIS без пропущенного символа

Я работаю над созданием файла, запрашивая данные из базы данных и использую его для создания файла, ситуация выглядит следующим образом: База данных: Oracle с кодировкой UTF8 Сервер приложений: Смола с кодировкой UTF8 Платформа приложений: NTT Intra-Mart (японская структура на основе на Rihno и с использованием javascript в качестве языка серверной программы) Необходимость: запрос данных из Oracle и создание файла с помощью кодировки [Shift-JIS], файл используется как промежуточный файл, который экспортируется одной системой и передается с помощью FTP в другую систему для импорта . Файл должен иметь фиксированный диапазон байтов, чтобы конечный сервер мог найти указанные данные для импорта: например, байт 1-10: [адрес пользователя] байт 11-20: [имя пользователя] Однако сначала я создаю файл с UTF8, кажется, все символы отображаются правильно, но когда я пытаюсь записать данные с кодировкой [SJIS], там некоторые полноширинные символы становятся вопросительными знаками половинной ширины [?], и это может привести к сокращению ширины байтов и невозможности правильного получения данных: например, когда данные [адрес пользователя], такие как: 1-10-1, данные в файле станут 1 × 10 × 1 байт 1-10: [адрес пользователя], но в текущем файле адрес пользователя - байты 1-8 байтов 11-20: [имя пользователя] не могли бы вы дать мне совет?


person auwind    schedule 04.07.2020    source источник
comment
Кодировка Shift-JIS не может представлять все кодовые точки, которые могут быть представлены UTF-8. UTF-8 может представлять весь диапазон кодовых точек Unicode.   -  person Mark Tolonen    schedule 06.07.2020


Ответы (1)


Вам нужно будет использовать имя набора символов Windows-31J, а не Shift-JIS.

Данные 1-10-1 будут набраны из Microsoft IME. Microsoft IME использует U+FF0D (ПОЛНАЯ ШИРИНА ДЕФИС-МИНУС) для представления символа .

  • U+FF0D не сопоставляется ни с одним символом в сопоставлении Shift-JIS - Unicode в JavaVM. Таким образом, вы получите ? при преобразовании из внутреннего представления JVM (UTF-16) в Shift-JIS с кодировкой Shift-JIS.
  • U+FF0D отображается в 0x817C в Windows-31J - Unicode отображается в JavaVM. Таким образом, вы получите при преобразовании из внутреннего представления JVM (UTF-16) в Shift-JIS с кодировкой Windows-31J.
person SATO Yusuke    schedule 14.07.2020
comment
Спасибо за совет, я общался с SE, и теперь мы отказались от способа чтения файла с указанными байтами и использования для этого CSV-файла. - person auwind; 18.07.2020