(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【UTF-8】日本語URLをnkfで変換する

スポンサーリンク

はじめに

URLには日本語を指定することも可能です。
例えば、はてなブログでもURLのデフォルトを以下のように設定できます。

  • /entry/2011/11/07/週末は川に行きました (/entry/日付/タイトル名)

一方、ブラウザでは見える日本語URLをそのままツイッターやメモ帳にペーストすると「%XX%XX...」という謎の変換が行われます。

URLの実体は変換後であるため、例えば日本語URLをプログラムからツイートしようとすると日本語URLでは該当ページに遷移しません。明示的に変換を行う必要があります。

本記事では、日本語URLをnkfで変換し、そのままURLとして添付できるようにする術を補足情報を交えながら紹介します。

日本語URLの変換

UNIX系環境では利用可能な「nkf」コマンドは文字コードの変換に便利です。

# which nkf
/usr/bin/nkf

日本語URLは「Quoted-printable encoding」にエンコードしてあげる必要があります。

QP encoding

この規格は、8ビットデータを7ビットデータパスで転送するためのもので任意のバイト値を一連のASCII文字に変換可能する際に利用されます。
具体的には、日本語を含む文字列を「=」の後ろに2桁の16進数文字を付けたもので表現し、例えば「」は「=E3=81=82」となります。

ASCII文字(半角英数字等)はそのままとなり、「aあ」は「a=E3=81=82」です。

nkfコマンド

quoted-printableエンコード/デコードツール等を用いずともnkf-MQ-mQで実現できます。
nkfのマニュアルには以下のように記載されています。

M MIME encode. Header style. All ASCII code and control characters areintact.
-MQ Perform quoted encoding.

m MIME ISO-2022-JP/ISO8859-1 decode. (DEFAULT) To see ISO8859-1 (Latin-1)
-mQ Decode MIME quoted stream. '_' in quoted stream is converted to space.

本環境ではUTF-8なのでnkfのオプション-Wを用いて

# echo $LANG
en_US.UTF-8

nkf -WMQで変換できます。

# echo "あ" | nkf -WMQ
=E3=81=82

逆変換はnkf -WmQ

# echo "=E3=81=82" | nkf -WmQ
あ

URLとしては「=」部分を「%」に変換する必要があるのでtrコマンドを用います。

# echo "あ" | nkf -WMQ | tr = %
%E3%81%82

例えば以下のURLにある%E...部分を変換すれば「システム障害」に関する検索であることが分かります。
https://news.yahoo.co.jp/search/;_ylt=A2RinFrlfwRcwAoA5iQPk.d7?p=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%9A%9C%E5%AE%B3&aq=-1&oq=&ei=UTF-8

# echo "%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%9A%9C%E5%AE%B3" | tr % = | nkf -WmQ
システム障害

終わりに

以下の記事にて自動ツイートを実現する際に、日本語URLが正しく認識できませんでした。

それへの対応方針として調査した際の結果をまとめました。

同様の調査をしている方の参考になれば幸いです。