Perl преобразовать строку в читаемый формат - PullRequest
1 голос
/ 05 мая 2020

У меня есть строка, и я хочу преобразовать ее для отображения в удобочитаемом формате. Ниже приведена строка и для декодирования в читаемый формат, например σταύρος . Я пробовал кодировку utf8, но не работал.

σταÏÏος

Я пробовал много способов, но неясно, какая кодировка использовалась с ним, чтобы преобразовать его в σταύρος

1 Ответ

0 голосов
/ 08 мая 2020

Ваш образец в моем браузере выглядит так: sample text Когда вы публикуете вопрос о том, как отображаются символы, вы всегда должны включать изображение. Персонажи могут не отображаться на компьютерах других людей, как на вашем. Они даже могут быть перекодированы сервером Stack Overflow. В этом ответе я предполагаю, что SO доставляет те же байты, которые вы отправили, и что я вижу то же, что и вы.

Ваши символы доставляются базой данных в UTF-8, но они отображаются как Windows -1252. Первый вопрос: знает ли Perl, что получает символы UTF-8. length $tring сообщит вам, сколько символов Perl думает, что видит. Если 7, то Perl знает, что данные находятся в UTF-8. Если 14, то Perl не уверен, что у него есть, поэтому он просто считает байты. Если 12, то Perl уже решил, что данные находятся в Windows -1252 (два ваших байта отбрасываются как недопустимые символы).

Я предполагаю, что вы получите 14, поэтому Perl использует для вывода кодировку оболочки по умолчанию. Вы используете машину Windows? Если вы получили 12 или 14, то вам нужно указать Perl, что входные данные находятся в UTF-8. Если вы читаете из дескриптора файла, вам просто нужно вставить строку binmode FH, ':encoding(UTF-8)' сразу после открытия дескриптора файла. Я предполагаю, что вы используете пакет API базы данных. Если да, то вам нужно прочитать документацию к пакету, чтобы узнать, как установить кодировку.

Если length $tring дает 7, то Perl знает, что у него есть, и проблема в выводе . Если вам нужна помощь с этим, вам нужно будет добавить подробности к вашему вопросу о том, как вы просматриваете вывод. Если вы просто печатаете на терминале, попробуйте binmode STDOUT, ':encoding(UTF-8)' перед тем, как начать печать.

Если вы хотите проверить данные так, как их видит Perl, используйте unpack 'H*', $tring. Вы получите либо cf83cf84ceb1cf8dcf81cebfcf82, либо cf83cf84ceb1cfcfcebfcf82, в зависимости от того, отменил ли Perl два недопустимых Windows -1252 байта.

...