Ваш образец в моем браузере выглядит так: Когда вы публикуете вопрос о том, как отображаются символы, вы всегда должны включать изображение. Персонажи могут не отображаться на компьютерах других людей, как на вашем. Они даже могут быть перекодированы сервером 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 байта.