Я использую формат 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.
Я надеюсь, у вас есть лучшее решение.