2014-11-19 2 views
0

Я пытаюсь определить правильную кодировку perl для использования на основе языка, установленного в среде. Это хорошо работает, когда язык является языком UTF-8, но один пользователь попытался установить свой LANG на «Ja_JP» в AIX.Perl: выберите кодировку на основе среды

$ LANG=Ja_JP perl -MI18N::Langinfo=langinfo,CODESET -E 'say langinfo(CODESET)' 
IBM-943 

К сожалению, я не знаю, как преобразовать это во что-то, что примет binmode.

ответ

1

Согласно странице Википедии на Shift JIS,

IBM CCSID 943 имеет те же расширения, как Code Page 932.

Таким образом, вы можете использовать :encoding(cp932)


Для того, чтобы :encoding(IBM-943) работать, вам нужно создать псевдоним в Encode :: Alias.

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

use Encode::Alias qw(define_alias); 
define_alias(qr/^ibm-943$/i => '"cp932"'); 

Вам потребуется поместить define_alias вызов внутри BEGIN { } если вы собираетесь следовать с

use open ':std', ':locale'; 
+0

cp932 (и, таким образом, IBM-943) отличается от Shift, JIS в том, что '5C' является "'\'"(как в ASCII) вместо "'' ¥". Набор символов в противном случае не включал бы разделитель каталога Windows. Шрифты, используемые совместно с cp932, иногда отображают '\' как '¥'. – ikegami

+0

Итак, это то, что каждый perl dev должен поймать и обработать. Я надеялся, что он уже инкапсулирован где-то, но, возможно, это просто AIX, который не обрабатывается, потому что это не одна из обычных платформ. Спасибо, @ikegami. – Tanktalus

+0

Он инкапсулирован где-то. Devs не нужно ловить и обрабатывать. Например, ': encoding (latin1)' работает, потому что 'latin1' определен в Encode :: Alias ​​как псевдоним для' iso-8859-1'. Это просто, что ваш конкретный псевдоним не определен в Encode :: Alias. Итак, что вам нужно сделать, это указать запрос функции, чтобы этот псевдоним был добавлен в Encode :: Alias. – ikegami

Смежные вопросы