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

プロフィール
どんぱん
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; 漢字統合作業にかかわる組織) による資料
マッピング各種文字コードへの対応付け
辞書索引
読み文字の読み方
辞書データ
画数文字の部首と残りの画数
異体字新旧字体のような、ある文字の別の字体
数値文字が数を意味する場合の数値


≫続きを読む

Unicodeエディター

中国語のテキストデータを編集や保存をしたいときに、Unicode対応のエディターがほしくなる。
身近なものでは、Windows XPについてるメモ帳がUnicodeに対応している。保存するときは文字コードをUTF-8にして保存する。フォントをMS UI Gothicにすると、表示も違和感がない。
データ整理では、ExcelがUnicodeに対応している。Excel互換のOpenOffice Calcも(ちょっと使いにくいけど)OKだ。
シェアウェアではEmEditorがUnicode対応をうたっている。これのフリー版があったのでしばらく試してみよう。
EmEditor Free
http://www.vector.co.jp/soft/winnt/writing/se047993.html

はじめての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;
}

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

≫続きを読む

Unicodeテスト

EUC-JPのページに簡体字を書くための練習。

[lang指定なし(lang="jp")]
o(◕‿◕o)(o◕‿◕)o
卧龙大熊猫俱乐部

[lang="zh"]
o(◕‿◕o)(o◕‿◕)o
卧龙大熊猫俱乐部


簡体字をIE6でエディタにコピペすると「・」と表示された。Firefox、Safariは入力時の表示もOK。
記事を保存して再編集すると簡体字の部分だけ10進コードに変わっている。なので自分で10進コードに変換してやる必要はない。
IE6ではlang="zh"と指定しないと簡体字が表示されない。Firefox、Safariはこの指定がなくても表示OK。lang="zh"は指定しておいたほうがいい。
簡体字を囲むのに無難なのは<font>タグかな。
例: <font lang="zh">简体字</font>

参考: 10進、16進文字コードin HTMLユニコード
| |
カレンダー
2019/09
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 - - - - -
ページナビ
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