web-dev-qa-db-ja.com

UTF-8ファイルをASCII(best-effort)に変換する

複数の言語のテキストを含むUTF-8のファイルがあります。それの多くは人の名前です。私はそれをASCIIに変換する必要があり、結果はできるだけ適切に見えるようにする必要があります。

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

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

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

27
user7610
konwert utf8-ascii

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

konwert utf8-xmetodo

エスペラントをx-メトード表現に変換したものです

konwert UTF8-tex

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

konwert UTF8-ascii/de

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

konwert UTF8-ascii/rosyjski

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

13

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

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

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

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

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

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

この例では、合成文字を使用してcaf? ?????を返します。

29
yellowantphil

uni2ascii -B input.txt >output.txt

ni2ascii

5
philcolbourn

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

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

bd llh lthny bn lHsynを生成します。これは、私の目的にとって許容できる結果です。

2
user7610

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

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

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

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

参照 https://stackoverflow.com/a/1398403/477035

2
RedGrittyBrick