2010-11-24 10 views
1

私はperl形式を使ってファイルに行を出力しています。perl形式とutfデータの問題

ieです。

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); 

それだけで? sのUTF文字を置き換える以外、私はまた、作品のどのソート

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"); 

を試してみました。

解決策は、文字列をファイルに出力し、その文字列をファイルに読み込んで変数に再度格納することです。

フォーマットはWindows環境で動作します。問題はunixでのみ起こります。

私はあなたに良い解決策があることを望んでいます。

+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->接続標準のperl DBIを使用して取得されます $ sql = "select write_name" \t "from person" \t "where person.id =" \t "'" $ student_number。"'"; \t \t \t $ sthは= $ dbh->($ sqlを)または \t \tダイ印刷STDERRを準備する "声明を準備できませんでした:$ sqlをする\ n個のデータベースエラー:$ 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; #ループ 書き込み(REPORT1); #書式付き出力をファイルに書き込む #endループ REPORT1は、上記の形式です。 – shawn