Перетворити шістнадцятковий Shift-JIS в символи


2

Я шукаю спосіб перетворити шістнадцяткове значення Shift-JIS в символ у командному рядку Unix / Linux.

Код таблиці Shift-JIS можна знайти тут .

Для:

82 ae (0x82ae)

Я б очікував:

Я знаю , що це як - то можна з ascii2uniта , nkfале я начебто застряг.

ПРИМІТКА. Я міг би це зробити, але це не очікуваний результат:

echo "0x82BE" | ascii2uni -a X | nkf -S
Result is: 1 token converted
闃セ

Я знайшов цю тему, яка пропонує використовувати, iconvале в кінцевому рахунку з тими ж результатами використовуючи цей метод

Чи можете ви допомогти людям?


Я знайшов superuser.com/questions/313032/…, але я знайшов той самий результат із їх методом.
Філіпп Ремі

Цей iconvрецепт повинен був перетворити Shift-JIS в UTF-8. Чи відображалось це як 闃 セ? Яку термінальну програму ви використовуєте?
Том Зич

Нехтуйте, це не термінальне кодування. Дивіться відповідь нижче.
Том Зич

Відповіді:


1

Виходячи з цієї відповіді на сайті Unix та Linux Stack Exchange , recodeдля мене чисто працює на Ubuntu 12.04.5 (LTS):

echo -n 0x82ae | recode SHIFT-JIS/x4..UTF-8

Звичайно, це перетворює вихід шістнадцяткового коду з Shift-JIS в UTF-8, але чорт… UTF-8 - це те, чим зараз користуються всі діти. Але ви можете просто відключити такі ..UTF-8речі, і вихід повинен бути чистим Shift-JIS:

echo -n 0x82ae | recode SHIFT-JIS/x4

Щоб підтвердити перетворення його на UTF-8 правильно, ви можете передати його xxdтаким чином:

echo -n 0x82ae | recode SHIFT-JIS/x4..UTF-8 | xxd -p -u

І він перевіряє, E38190що відповідає такому ж символу в UTF-8, як показано тут . Повну таблицю відображень переходів Shift-JIS в UTF-8 можна знайти тут .

Або ви можете просто запустити xxdз цього командного рядка, щоб отримати точний шістнадцятковий код для будь-якого символу - або серії символів - ви хочете:

echo -n "ぐ" | xxd -p -u

1
Вони також iconvповинні були перетворитись на UFT-8. Я підозрюю, що його термінал використовує інше кодування.
Том Зич

1
Ні, я помилився. Складання відповіді зараз.
Том Зич

1
Джейку, дякую за чітку відповідь. Це працює зараз!
Філіпп Ремі

@TomZych Немає проблем. Проблеми з кодуванням символів можуть бути трохи магією, коли ви з ним стикаєтесь. Магія, головні болі та удача.
JakeGould

2

Ваш файл не містить двійкового файлу, який, на вашу думку, є. ascii2uni не кодує так, як ви очікуєте; Я не впевнений, чому.

echo "0x82BE" | ascii2uni -a X > test1
od -tx1 test1
0000000 e8 8a be 0a

(Зверніть увагу, це echo -nробить те саме. Новий рядок 0aнадходить ascii2uni, не echo.)

Перетворення цього за допомогою iconv:

iconv -f SHIFT-JIS -t UTF-8 test1 > test2
od -tx1 test2
0000000 e9 97 83 ef bd be 0a
cat test2
闃セ

Який у вас і є. (Зауважте також, що у вашому прикладі ascii2uni ви мали 82BE, що є だ у Shift-JIS, замість оригіналу 0x82ae, який є ぐ. Я буду дотримуватися 82BE.)

Проблема полягає в тому, що бінарний не був правильним для початку. Зробіть це так:

echo -en '\x82\xbe' > test3
od -tx1 test3
0000000 82 be
iconv -f SHIFT-JIS -t UTF-8 test3 > test4
od -tx1 test4
0000000 e3 81 a0
cat test4
だ

Дякую за пояснення. Саме те, що мені було потрібно. Цінується!
Філіпп Ремі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.