2

OK、utf-8 コードを含む小さなテスト ファイルがあります。こちらです(言語はウォロフです)

Fˆndeen d‘kk la bu ay wolof aki seereer a fa nekk. DigantŽem ak
Cees jur—om-benni kilomeetar la. MbŽyum gerte ‘pp ci diiwaan bi mu

通常のエディタではこのように表示されますが、16 進数では次のようになります。

xxd test.txt
0000000: 46cb 866e 6465 656e 2064 e280 986b 6b20  F..ndeen d...kk 
0000010: 6c61 2062 7520 6179 2077 6f6c 6f66 2061  la bu ay wolof a
0000020: 6b69 2073 6565 7265 6572 2061 2066 6120  ki seereer a fa 
0000030: 6e65 6b6b 2e20 4469 6761 6e74 c5bd 656d  nekk. Digant..em
0000040: 2061 6b0d 0a43 6565 7320 6a75 72e2 8094   ak..Cees jur...
0000050: 6f6d 2d62 656e 6e69 206b 696c 6f6d 6565  om-benni kilomee
0000060: 7461 7220 6c61 2e20 4d62 c5bd 7975 6d20  tar la. Mb..yum 
0000070: 6765 7274 6520 e280 9870 7020 6369 2064  gerte ...pp ci d
0000080: 6969 7761 616e 2062 6920 6d75 0d0a       iiwaan bi mu..

2 番目の文字 [cb86] は a-grave [à] の非標準コーディングであり、Web ドキュメントで非常に一貫して見られますが、「実際の」utf-8 では、a-grave は c3a0 になります。Real utf-8 は、Mac と Windows で美しく動作します。

この小さなキャレットは cb86 が生成するものであり、次のように (テキスト ウィジェットで) テキストを表示するために MAC ですべて正常に動作するため、ペア { ˆ à } を含む文字マップを使用して偽の utf-8 を処理します。

Fàndeen dëkk la bu ay wolof aki seereer a fa nekk. Digantéem ak
Cees juróom-benni kilomeetar la. Mbéyum gerte ëpp ci diiwaan bi mu

PC で - 同じファイル (共有) を使用すると、読み込まれる最初の 3 文字は 46 cb 20 (fconfigure を使用しない) です。可能なすべてのエンコーディングを実行しましたが、同じマップを機能させることはできません。[46 cb 86 を許可するのは 20 個あります]

長くなってしまい申し訳ありませんが、どなたかご存知の方がいらっしゃいましたら教えていただきたいです。

テルモンクス

4

2 に答える 2

1

ウォロフは全く知りません。ただし、あなたが抱えている問題は、(標準の Unicode ではなく) 非標準のコード ポイントを使用し、次に UTF- 8スキーム。これは厄介です!

これに対処する方法は、最初にutf-8エンコーディングを使用するように構成されたチャネルを使用してバイトを Tcl に読み込むことです。

set f [open $filename]
fconfigure $f -encoding utf-8
set contents [read $f]
close $f

string map次に、 「間違った」文字を正しい文字に変換する変換を適用する必要があります。たとえば、これはあなたがリストした特定の文字に対して(私が知る限り)それを行います:

set mapping {"\u02c6" "\u00e0"}
set fixed [string map $mapping $contents]
# You should now be able to do anything you want with $fixed

しかし、それはすべて間違っているかもしれません!問題は、ファイルの内容がどうあるべきかわからないことです(バイトではなく文字のレベルで)。これは、「ウォロフをまったく知らない」という私のコメントに戻ります。

アップデート

dan04 がその不適切なテキストに何が行われたかを特定したので、デコード方法を提供できます。上記のようにコードを読みますが、ここでは別のマッピング手順を使用します。

set fixed [encoding convertfrom macRoman [encoding convertto cp1252 $content]]

提供されたサンプルでは、​​期待される出力が生成されます。

于 2010-07-24T20:13:35.430 に答える
0

The data was originally encoded using a Mac encoding (most likely Roman, but Turkish and Icelandic are also possible for this example), misinterpreted as windows-1252, and then correctly converted to UTF-8.

于 2010-07-24T20:40:42.900 に答える