2010-11-24 3 views
1

파일에 줄을 인쇄 할 때 perl 형식을 사용합니다.perl 형식 및 utf 데이터의 문제

즉.

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

나는 uft8 문자 세트를 사용하는 Oracle 데이터베이스에서 $ write_name을 검색합니다.

이 데이터는 수유 데이터베이스를 uft8로 변환 할 때까지 잘 작동합니다. 나는 그것이로 사용 모르겠어요,하지만 형식은 지금과 같은 라인을 제공 UTF 8

아니었다합니다 (< < 통지 >>와 @의)

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          << [email protected]>>>>>  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 문자를 대체합니다 제외.

문자열을 파일로 출력 한 다음 문자열을 파일로 다시 읽고 변수에 다시 저장하면 해결 방법이 발견됩니다.

형식은 Windows 환경에서 작동합니다. 이 문제는 유닉스에서만 발생합니다.

더 나은 해결책이 있기를 바랍니다.

+1

적용되지 않을 수도있는 몇 가지 사항을 게시했습니다. 일부 혼란을 피하는 것이 좋습니다. 그러나 실제로 더 많이보고 싶습니다. 데이터를 데이터베이스에 저장하는 방법과 데이터를 가져 오는 방법이 문제 일 가능성이 큽니다. UTF-8은 멀티 바이트 문자가있을 수있는 바이트 문자열입니다. 멀티 바이트 부분의 인코딩을 맹 글링해야합니다 (선두 문자 또는 멀티 바이트 문자 다음의 일부). – zanlok

+0

Oracle에서 반환 한 데이터의 UTF-8 플래그가 켜져 있습니까? 아니면 꺼져 있습니까? 출력 스트림을 명시 적으로'binmode' 했습니까? – tchrist

답변

0

API 사용이 미흡하여 형식 사용이 권장되지 않으므로 대신 Template :: Toolkit을 사용해보세요.

+0

데이터는 표준 DBI를 사용하여 검색됩니다. $ dbh = DBI-> connect ("dbi : Oracle : $ ODS_DB", $ ODS_ADPCOS_ID, $ ODS_ADPCOS_PSWD) 또는 "die on connect"; ("오라클 : $ ODS_DB DBI"$ ODS_ADPCOS_ID, $ ODS_ADPCOS_PSWD) \t \t 또는 "연결에 다이"다이; – shawn

+0

데이터는 $ DBH = DBI-> 연결 표준 펄 DBI를 사용하여 검색 될 $ sql = "select write_name" \t "사람으로부터" \t "where person.id =" \t " '". $ student_number." '"; \t \t \t $ STH = $ dbh-> ($의 SQL) 또는 \t \t 다이 인쇄 STDERR을 준비 "문을 준비 할 수 없습니다 : $의 SQL \ 없음 데이터베이스 오류 : $ DBI :: errstr을"; $ sth-> execute() 또는 \t 죽은 인쇄 STDERR "실행할 수 없습니다 : $ sth \ n 데이터베이스 오류 : $ DBI :: errstr"; \t \t ($ write_name) = $ sth-> fetchrow_array; – shawn

+0

# 파일로 작성 열기 (REPORT1, ">> $ report_file") 또는 죽은 인쇄 STDERR "출력 파일을 열 수 없습니다 - $ report_file - $! \ n"; \t select REPORT1; $ FORMAT_LINES_PER_PAGE = $ my_lines_page; $ FORMAT_PAGE_NUMBER = 0; $ FORMAT_LINES_LEFT = 0; #Loop 쓰기 (REPORT1); #form formated output to file #end loop REPORT1은 위에 주어진 형식입니다. – shawn