空があんなに高い
歌って踊れるプログラマーを目指して

プロフィール
どんぱん
Author: どんぱん

最近の記事とコメント
トラックバックリスト
カテゴリ
ユーザータグ
過去ログ
メールフォーム

NKFでUTF-8に変換するとおかしい

NKFでShift_JISのテキストをUTF-8に変換すると、「~」が「〜」に化けます。この現象が前から気になっていたので調べてみました。

Shift_JISで全部の文字コードを書いたテキストファイルを作り、Windowsのエディターを使ってこれをUTF-8で保存したファイルと、同様にNKFで変換したファイルを作ります。
この2つを比べてみると、(第1水準以下で)違いがあったのは以下の10文字でした。(第2水準以上ではだいぶ違っていたような気がしましたが、見なかったことにします。)

WindowsNKF
¥
¢
£
¬
¦

Unicodeのコード空間はShift_JISより広く、Shift_JISの1文字がUnicode空間上では複数の文字に対応づく場合があります。上記のことが起こるのはこのためで、NKFの変換結果は必ずしも間違いではありません。
ですが、変換した結果をWindows上で見たり編集したりする必要がある場合は、Windowsと同じ結果を得たいところです。
これには、NKFの出力の文字コードを上記のとおりに置き換えると、いい感じの結果になります。

Rubyで書くとこんな感じです。

sjis.rb:
require 'nkf'
while !STDIN.eof
  l = NKF.nkf("-Sw", readline)
  table = [
    [ "\xe2\x80\xbe", "\xef\xbf\xa3" ], #  ̄
    [ "\xe2\x80\x94", "\xe2\x80\x95" ], # ―
    [ "\xe3\x80\x9c", "\xef\xbd\x9e" ], # ~
    [ "\xe2\x80\x96", "\xe2\x88\xa5" ], # ∥
    [ "\xe2\x80\x92", "\xef\xbc\x8d" ], # -
    [ "\xc2\xa5", "\xef\xbf\xa5" ], # ¥
    [ "\xc2\xa2", "\xef\xbf\xa0" ], # ¢
    [ "\xc2\xa3", "\xef\xbf\xa1" ], # £
    [ "\xc2\xac", "\xef\xbf\xa2" ], # ¬
    [ "\xc2\xa6", "\xef\xbf\xa4" ], # ¦
  ].each do |t|
    l.gsub!(/#{t[0]}/, t[1])
  end
  print l
end

このソースをShift_JISで書いたとして、
$ nkf -Sw < sjis.rb > u.txt
とやると、もともとNKFが変換した結果になり、
$ ruby sjis.rb < sjis.rb > u2.txt
とやると、Windowsと同様の結果になります。

なお、NKFを使うときに、Shift_JIS←→EUCの変換は上記の問題がありません。UTF-8→Shift_JIS/EUCも問題ありません。注意すべきなのはShift_JIS/EUC→UTF-8の変換のみです。
スポンサーサイト



はじめてのUnicode(その2)

前回の記事「はじめてのUnicode」で、わんさか出てきたタグの意味を少しずつ理解していこう。
まずは大まかな分類から。

タグの分類
分類説明
IRG資料IRG (Ideographic Rapporteur Group; 漢字統合作業にかかわる組織) による資料
マッピング各種文字コードへの対応付け
辞書索引
読み文字の読み方
辞書データ
画数文字の部首と残りの画数
異体字新旧字体のような、ある文字の別の字体
数値文字が数を意味する場合の数値


≫続きを読む

ページ移動スクリプト

FC2ブログ用のページ移動スクリプトを書いてみた。
「ページナビ」という名前で共有プラグインとして公開。申請から公開まで、10日かかった。
次のページに対応する:
・ページ別:  /page-1.html
・カテゴリ別: /category2-1.html
・月別:    /blog-date-200807-1.html
・日別:    /blog-date-20080808-1.html
・検索結果: /?q=%A5%D1%A5%F3%A5%C0&page=1
・タグ検索結果: /?tag=%A5%D1%A5%F3%A5%C0&page=1

テンプレの好きな場所にこういうふうに書くと:
<script type="text/javascript"><!--
pagenavi(2); //--></script>
表示はこんなふうになる:
1 . 7 8 9 10 11 ... 25
このようにたとえば引数に2を指定すると、現在ページの前後各2ページまでページ番号を表示する。

表示しているページ番号と先頭ページまたは末尾ページとの間が2つ以上あいている場合に、「...」のように省略表示をする。この「.」それぞれにもリンクが張ってあり、クリックするとそのページ近辺に飛ぶ。2回のクリックで目的のページ番号に飛べるように作ってある。

肝心な関数のソースは、テンプレの<body>タグの下あたりに書く:

≫続きを読む

はじめてのUnicode

Unicodeを経由して漢字を変換(とりあえず日本と中国の漢字)するにはどうすんだろと思い、総本山をたずねてみた。
Unicode Home Page
http://www.unicode.org/

漢字のデータはUnihan.txtという1個のテキストファイルにまとまっている。現在のバージョンはUnicode 5.1.0だった。ちなみにhanは「漢」のピンインだ。
http://www.unicode.org/Public/UNIDATA/Unihan.zip
この中にある1ファイルが29MBもある。文字のいろいろな意味づけをタグをつけて分類し、1つの文字に対して、1行1タグで数十タグも記述してあるので、やけにでかいのだ。この大きさだと扱うのが大変な(notepadが固まってしまうw)ので、タグ別にファイルを分割してみる。
#include <stdio.h>
#include <string.h>
 
int main(void)
{
	FILE *fp;
	char buf[4096];
	char *p, *code, *tag, *desc;
	char fname[256];
 
	while (fgets(buf, sizeof(buf), stdin) != NULL) {
		if (strncmp(buf, "U+", 2) != 0)
			continue;
		p = buf + 2;
		code = p;
		if ((p = strchr(p, '\t')) == NULL)
			continue;
		*p++ = '\0';
		tag = p;
		if ((p = strchr(p, '\t')) == NULL)
			continue;
		*p++ = '\0';
		desc = p;
		if ((p = strchr(p, '\n')) == NULL)
			continue;
		*p = '\0';
		sprintf(fname, "%s.txt", tag);
		if ((fp = fopen(fname, "a")) != NULL) {
			fprintf(fp, "%s\t%s\n", code, desc);
			fclose(fp);
		} else
			perror(fname);
	}
	return 0;
}

このインチキプログラムで、数十分もかかってやっと処理が終わり、タグごとにたくさんのファイルが出来上がった。タグはそれぞれに役割があるので、そこから必要なものを利用する。

≫続きを読む

誤差拡散の画像処理

後輩が誤差拡散について習ったというので、そういえば誤差拡散をする画像変換プログラムを昔作っていたことを思い出した。変換例をまとめておこう。

(1) オリジナル画像。芹が谷公園の野良猫さんです。


(2) しきい値を元に2値にした画像。明るさの中間点を基準にして明暗を決めています。



≫続きを読む

プログラミング言語Lua

使い勝手がいまいちだがイーサネットのパケット解析で重宝するワイヤシャーク(イスィーリオ)で、ユーザーが組み込めるスクリプトには、Luaという言語が採用されているそうだ。言語の思想が面白そうだったのでとりあえず原書「Programming in Lua」を注文してみた。すでに数ヶ国語に翻訳されているので、そのうち邦訳も出るかもしれない。
Programming in LuaProgramming in Lua
(2006/03/05)
Roberto Ierusalimschy

商品詳細を見る

追記:
邦訳も出版された。原書のほうが安いです。
Programming in Lua プログラミング言語Lua公式解説書Programming in Lua プログラミング言語Lua公式解説書
(2009/08/28)
Roberto Ierusalimschy

商品詳細を見る

| |
カレンダー
2019/10
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
ページナビ
twitter
スケジュール
ピンイン入力
四声数字を四声記号に変換します
(a,e,i,o,u,v(=ü); 1,2,3,4)

リンク集
Copyright 2019 空があんなに高い Some rights reserved.
Photo by Rain Drop // Template by chocolat* // Powered by FC2