UTF-8ファイルをASCIIに変換する(ベストエフォート)


23

複数の言語のテキストを含むUTF-8のファイルがあります。それの多くは人々の名前です。それをASCIIに変換する必要があり、結果を可能な限りまともなものにする必要があります。

より広いエンコードからより狭いエンコードへの変換をアプローチする方法は多数あります。最も単純な変換は、すべての非ASCII文字を「_」などのプレースホルダーに置き換えることです。ファイルが記述されている言語がわかっている場合は、ローマ字表記などの追加の可能性があります。

Unixで利用可能なUnixツールまたはプログラミング言語ライブラリは、UTF-8からASCIIへの適切な(ベストエフォート)変換を可能にしますか?

テキストのほとんどは、ヨーロッパのラテン系ベースの言語です。


1
どの言語がどこから始まるのか知っていますか?たとえば、ウムラウトの非可用性を処理する方法に違いがあります(öなど)。ドイツ語ではいつでも「oe」を書くことができますが、たとえばオランダ語ではウムラウトが使えないことをダッシュ​​とそれに続くウムラウト文字で「記述する」ことができます(「oe」は完全に異なる二重母音です)
Anthon

どのように「可能な限りきちんと」定義していますか?本当に難しいのは、マッピングを定義することです。それに比べて、プログラミングタスクは簡単です。実際に使用されるマッピングは大きく異なり、言語固有の2つの方法があります。テキストの言語と読者の想定言語に依存します(特にローマ字化に関して)。
ユッカ・K・コルペラ

@ JukkaK.Korpelaは、「できる限りまともな」ことはもちろん、私が求めている「Unixで利用可能なUnixツールまたはプログラミング言語ライブラリ」を作成した人々によって定義されています。私が得ようとしている最高のものがすべての非ASCIIをアンダースコアで置き換えることであるなら、私ができることは他にあまりありません。独自のツールを書くことを除いて、私はそうしません。Unix @ SOはこの質問に最適な場所ではないかもしれないと思います…
user7610

1
@ user7610 and以外iconvtrUnidecodeがあります。私はそれに慣れていませんが、Pythonを使用できるなら、あなたが望むことをするかもしれません。
yellowantphil 14

1
JavaScript / nodeの@yellowantphilまたはnode-unidecode、C♯のUnidecodeSharp、またはPerlのText :: Unidecode。この名前の最初にあります。他のバージョンもあると思います。
user7610 14

回答:


11
konwert utf8-ascii

変換テーブルに応じて、ベストエフォート型の変換を行います。入力言語をほぼ知っている場合、より良い結果を与える言語固有のフィルターがあります。例えば

konwert utf8-xmetodo

エスペラントをx-metodo表現に変換することです。

konwert UTF8-tex

発音区別記号のTeX表現を試みます。言語固有のパラメーターがあります。

konwert UTF8-ascii/de

「ä」を平易な「a」の代わりに「ae」(ドイツ語の慣習)に音訳します

konwert UTF8-ascii/rosyjski

「英語のような」規則などの代わりに、ロシア語の音訳にポーランド語の規則を使用します...


これはkonwertウェブサイトの最新の場所ですか?どこにパッケージされていますか?github.com/taw/konwert/tree/master/konwert-1.8
ニモ

25

これはいくつかのことで機能します:

iconv -f utf-8 -t ascii//TRANSLIT

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT 返す helloe ?iconv変換方法がわからない文字は、疑問符に置き換えられます。

iconvPOSIXですが、すべてのシステムにTRANSLITオプションがあるかどうかはわかりません。Linuxで動作します。また、このIGNOREオプションは、ターゲット文字セットで表現できない文字を静かに破棄します(man iconv_open)。

劣っていますがPOSIX準拠のオプションはを使用することtrです。このコマンドは、すべての非ASCIIコードポイントを疑問符に置き換えます。UTF-8テキストを一度に1バイトずつ読み取ります。「É」は、結合アクセントを使用してエンコードされたか、合成済みの文字を使用してエンコードされたかに応じて、E?または?に置き換えられます。

echo café äëïöü | tr -d '\200-\277' | tr '\300-\377' '[?*]'

その例はcaf? ?????、事前に構成された文字を使用してを返します。


tr一度に1バイト動作することを意図していません。GNU trはそうですが、それはバグです。
ステファンシャゼル

3
iconv -f utf-8 -t ascii//TRANSLIT私にとってはうまくいきました。それは、カーリー引用符をストレート引用符に変更しました。ありがとう。
パニック大佐

iconvは、ピンインなどのアクセントの強い文字で停止することに注意してください。
sventechie 16

//TRANSLIT他の文字セット、例えばにも機能することに注意してくださいiso-8859-1//TRANSLIT
スキッピールグラングロウ

iconviconv: illegal input sequence at position 1234私にファイルを提供し、切り捨てます。キャラクターを削除して、再びシーケンスを取得しようとしただけでいいと思います。
jozxyqk


2

複数の言語の[人の名前]を含むUTF-8のファイルがあります[ASCIIで意味のあるものに変換したい]。

次の名前を、関係者が反対しないASCII文字列に変換できるようにしたいということですか?

  • ஸ்றீனிவாஸராமானுஜன்ஐயங்கார்
  • عبداللهالثانيبنالحسين

これを行うことができる自動化されたツールはないと思われます。個人名のラテン化はまったくないか、非常に多くあります。ソフトウェアは、文化的に許容されるバージョンを選択できません。少なくとも、ソフトウェアが関係者の文化について多くのことを知っていなければ。

/programming//a/1398403/477035も参照してください


2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'「bd llh lthny bn lHsyn」を生成します。これは、私の目的にとって十分な音訳です。
user7610

4
@ user7610:結構ですが、ヨルダンのアブドゥッラ2世王は同意しないかもしれません。重要な誰かがCEOに苦情を申し立てる場合に備えて説明を準備します:
RedGrittyBrick

2

このために、PerlをText :: Unidecodeで使用することになりました。例:

perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")

を生成しますがbd llh lthny bn lHsyn、これは私の目的には受け入れられる結果です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.