1

EncodingUTF-8 のデータ型エンコーディングを持つテキスト ファイルがあります。純粋に英語の文字の場合、すべてのデータが正常に解析され、テーブルにインポートされます。しかし、フィールドに漢字が混在していると問題が発生します。漢字などの文字が混在している場合に、データを正常に読み取って解析する方法。

以下は、中国語の文字を保持するテキスト タブ区切りファイルのサンプルです。デバッグ モードの間、変数 ls_unicode はテキスト ファイルの値を保持し、漢字が存在します。

ここに画像の説明を入力

データがテーブルに保存されると、これが出力されます。

ここに画像の説明を入力

以下のスクリプトはなんとか漢字を取得し、DW update メソッドは成功を返しますが、列の値を確認すると、Globe MUX Project(客户号合同:NA). また、Globe MUX Project(客户合同号:NA) という値が存在することをデバッグ モードから確認しました。DB 列も NVarChar データ型に変更されます。

 //#################################
li_FileNum = FileOpen(is_sourcepath, StreamMode!, Read!, LockWrite!)
ll_FileLength = FileLength(is_sourcepath)
eRet = FileEncoding(is_sourcepath)
IF eRet = EncodingANSI! and ll_filelength <= 32765 THEN 
    li_bytes = FileReadEx(li_FileNum, lbl_data)     
    ls_unicode = String(lbl_data, EncodingUTF8!)    

    dw_1.Reset( )
    dw_1.ImportString(ls_unicode)
    ls_sonum = String(dw_1.Object.shipmentOrderNum[1])
    ls_chinesechar = String(dw_1.Object.contractnum[1])
    sle_char.Text = String(dw_1.Object.contractnum[1])
    dw_1.SetItem(1,'contractnum',ls_chinesechar)
    dw_1.SetItem(1,'fname','TEST')
END IF
FileClose(li_FileNum)


IF dw_1.Update( ) = 0 THEN 
    Commit Using SQLCA;
END IF
//#################################

また、テストを行い、手動の SQL Insert ステートメントを実行したところ、値「Globe MUX Project(客户合同号:NA)」が列に正常に記録されました。列のデータ型が NVarChar/NChar/または NText の場合、PB はこれを自動的に行わないと思います。

INSERT INTO SCH_HUAWEI_EDI_3B12RHDR (  COntractnum , FNAME ) 
VALUES ( N'Globe MUX Project(客户合同号:NA)' , 'TEST' ) 
4

2 に答える 2

1

Powerbuilder では、utf-8 または utf-16 ファイルの先頭にBOM (バイト オーダー マーク)FileEncoding()が存在することが正しく読み取られるか、 .

あなたの場合、16進エディタでファイルを見ると、最初のバイトEF BB BFがut-8 BOMであることを示す必要があります。

ファイルに utf-8 BOM があれば、ファイルの内容を変換する必要はありません。PB が自動的に変換します。v10 以降の PB では、すべての文字列データが内部で変換され、utf-16 で処理されます。

ところで、提案された pbscript では、ファイルを 2 回閉じています。

于 2013-10-01T11:15:26.977 に答える
0

列のデータ型で管理する必要があることがわかりました。DB 列のデータ型を varchar から NVarChar に変更し、次のようにテーブルを更新しました。

UPDATE SCH_HUAWEI_EDI_3B12RHDR SET contractnum = N'Globe MUX Project(客户合同号:NA)' 
WHERE ShipmentOrderNum = 'DPH11309160073CC'

予想される結果セットは次のとおりです。

ここに画像の説明を入力

更新ステートメントでは、設定値の前に大文字の N が付けられていました。更新にデータストアを使用しているため、上記の更新ステートメントを組み込む方法について、どのようにお勧めしますか? またはより良い質問は、PowerBuilder でデータストアを使用して漢字を格納する方法ですか?

以下は PB スクリプトです。

IF (ids_edihdr.ImportFile(ls_SourcePath,1,1) = 1 ) AND (ids_edidtl.ImportFile(ls_SourcePath,2) > 0 ) THEN 
    //HEADER
    IF ids_edihdr.RowCount() = 1 THEN 

                // Add script here to manage the mixed English and Chinese character values.

        ids_edihdr.SetItem(1,'Fname',Upper(as_file))
        ids_edihdr.SetItem(1,'CREATEDBY',Upper(SQLCA.LogID))    
        ids_edihdr.SetItem(1,'CREATEDDATE',idt_TranDate)    
    END IF
END IF

ids_edihdr.AcceptText()

ll_ret = ids_edihdr.Update()
IF ll_ret < 0 THEN GOTO ERR

Commit Using SQLCA; 
ls_DestPath = is_ArchInboundPath + Upper(as_file)
FileCopy(ls_SourcePath,ls_DestPath)
FileDelete(ls_SourcePath)               
GOTO DEST

ERR:
ROLLBACK Using SQLCA;
ls_ErrorPath = is_archerrorpath + Upper(as_file)
FileCopy(ls_SourcePath,ls_ErrorPath)
FileDelete(ls_SourcePath)

DEST:
Destroy ids_edihdr
于 2013-10-02T07:32:57.057 に答える