проблема с форматом perl и данными utf - PullRequest
1 голос
/ 24 ноября 2010

Я использую формат perl для вывода строк в файл

, т. Е.

format REPORT1 =
@<<<<<<<<  @<<<<<<<<  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  @>>>>>       @>>>>>       @>>>>>    @>>>>>       @>>>>>
$write_student_number,  $write_serial, $write_name, $write_attempted, $write_correct, $write_score, $write_percent_correct, $write_percent_score
~~                    ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                      $write_name
-----------------------------------------------------------------------------------------------------------------------------
.

Я получаю $ write_name из базы данных оракула, которая использует набор символов uft8.

Эти данные хорошо работали, пока мы не преобразовали базу данных кормления в uft8.Я не уверен, что это было раньше, но это не было UTF 8.

Формат теперь дает такие строки, как (обратите внимание на << >> и @'s)

009999990  000000133  Anderson, Charlie                                       30           25           25      83.3         83.3

-----------------------------------------------------------------------------------------------------------------------------

009999951  000000132  Smith, Josée                                            29>>         21   @>>>    21>>>   70.0    @>>  70.0

                      ,

-----------------------------------------------------------------------------------------------------------------------------

009999934  000000131<<Quiring, Randy                                     <<    30@>>>>>     12           12 @>>  40.0>

Вместо

009999990  000000133  Anderson, Charlie                                        30           25           25      83.3         83.3

-----------------------------------------------------------------------------------------------------------------------------

009999951  000000132  Smith, Josée                                            29           21           21      70.0         70.0

-----------------------------------------------------------------------------------------------------------------------------

009999934  000000131  Quiring, Randy                                           30           12           12      40.0    

Я пытался использовать несколько различных решений, которые я нашел в Интернете, но ни одно из них не помогло.

binmode STDOUT, ":utf8";

use open qw( :std :encoding(UTF-8) );

use Encode;
use Encode 'is_utf8';

$first_name = decode_utf8($first_name);

Я также пытался

use Encode 'from_to';
from_to($write_name, "utf-8", "iso-8859-1");

open my $fh, ">:utf8", $filename
    or die "could not open $filename: $!\n";

и

from_to($write_name, "utf-8", "WINDOWS-1252");

, который работает, за исключением того, что он просто заменяет символы utf на ? s.

Найденное решение, которое выполняет работу, если я распечатываю строкув файл, затем прочитайте строку обратно в файл и снова сохраните ее в переменной.

Просто примечание, формат работает в среде Windows.Проблема возникает только в Unix.

Я надеюсь, у вас есть лучшее решение.

1 Ответ

0 голосов
/ 25 ноября 2010

Использование формата не рекомендуется из-за того, что его API просто сумасшедший, вы можете вместо этого поработать с Template :: Toolkit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...