BOM付きUTF-8でJavaにつまづきnkfのバグにぶちあたる 
水曜日, 2月 14, 2007, 07:56 PM - プログラム
Debian LinuxからUbuntuに乗り換えたときに
言語をeuc-jpからUTF-8に変更した。
そのときにファイル名とファイルのエンコーディングもeuc-jpからUTF-8に変換したのだが、
二重につまづいた。

まずファイル名の変換はconvmvコマンドで難なく成功した。
次に手持ちのJavaのソースコードを変換する。
Javaのソースコードを一個一個エディタで開いて変換していたら切りがないので
nkfとfindコマンドを使ってエイヤッと変換する。
nkfはファイルを直接変換しないのでqnkfというスクリプトを自分で作る。
qnkf
#!/bin/sh
cat $1 | nkf -w8 > oldfile.tmp
cp oldfile.tmp $1
rm oldfile.tmp

で、これを使って次のコマンドでエイヤッと変換する。
$find -name \*.java -exec qnkf {} \;


変換されたJavaのソースコードをコンパイルしようとしたらエラーが出た。
$ javac HelloWorld.java 
HelloWorld.java:1: \65279 は不正な文字です。
import java.util.ArrayList;
^
エラー 1 個

\65279って何だろう?
そう思ってググってみたらこんなのが見つかった。

UnicodeのUTF-16など16ビット幅のエンコーディング方式において、
エンディアンを指定するためにファイルの先頭に記入される16ビットの値。
IT用語辞典e-Wordより抜粋

つまりUTF-8のBOMのようでmUTF-8を使っているので別におかしなものではないようだ。
ではなんでエラーになるのかというとバグレポートで次のようなのがあった。
Bug ID: 4508058 UTF-8 encoding does not recognize initial BOM
結局javacがBOMを認識できないことが原因のようだ。

対処法はある。BOMを除去すればよい。
そもそもなんでBOMが付いたのかというと、上のqnkfのスクリプトの中で
nkfの-w8オプションを使用したからである。
nkfのオプションを-w8ではなく-w80にすれば良いわけだ。
           -w -w80
UTF8 コードを出力する。 (BOM 無し)

-w8 UTF8 コードを出力する。
nkf(2006-05-14)のmanページより抜粋

でもエラーがでた。
おかしいなと以下のようなコマンドを実行してみた。
$ echo -n "t" | nkf -w8 | od -t x1
0000000 ef bb bf 74
0000004

$ echo -n "t" | nkf -w80 | od -t x1
0000000 74
0000001

$ echo -n "t" | nkf -w8 | nkf -w80 | od -t x1
0000000 ef bb bf 74
0000004

一つ目はBOM付きで出力しているからef bbが付加している。
二つ目はBOM無しで出力しているからef bbが付いていない付加してい。
三つ目はBOM付きを再度BOM無しに変換しているのに付いている。
というわけで原因はnkfのバグだった。

使用していたnkfのバージョンはUbuntuのedgyの最新の2.0.7 (2006-06-13) だったけど、
本家の最新版の2.0.8 (2007-01-28) にしたらこの不具合は解消されていた。

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 1148 )

爆裂タンクのプレイ画面をYouTubeにアップロード 
火曜日, 2月 13, 2007, 11:25 PM - プログラム
爆裂タンクのプレイ画面を録画してYouTubeにアップしてみた。
レコーダーの問題か性能の問題か、録画の画質というかフレームレートが低い。
ちと改善方法がないものか試行錯誤しないといけないようだ。


とりあえず更新としてシングルゲームを追加。

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 1244 )

爆裂タンク 
水曜日, 12月 13, 2006, 07:41 AM - プログラム
過去に作ったボンバーマンオンラインもどきのエンジンを使って
対戦シューティングを作ってみる。
弾幕シューティングの敵を操作できないかというのが
発端となったコンセプト。
基本操作はマウス+キーボードだけどキーボードだけでも操作可能。

http://www.cattaka.net/index.php?Bakutan

マップが狭いためか画面が爆風で埋まる。
マップを広くしようかなぁ。

そしてニューラルネットワークでAI作ってみるけどかなりお馬鹿。
まったく使えないわけじゃないけど、
有限状態機械とハイブリットにするといいのかなぁ。
  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 2.9 / 108 )


Back