iniファイルリストによるコード付けNo.05094
マボカル さん 06/03/10 00:08
 
こんにちはマボカルと申します。

SJISにある日本語相当の文字に対してユニコードでのコード値を
付けて、その結果を別の作業に利用しようとしています。いちいち
一つ一つの文字を
http://www.nii.ac.jp/CAT-ILL/PUB/font/www/table/
のようなサイトから検索してコード値を探すのは大変なので、以下の
ようなマクロを動かしてiniファイルリストによるコード値付けを
行おうとしています。

//sample.txt








// 060308.mac
down;
while (result) {
  golineend;
  insert getinistr(currentmacrodirectory + "\\utf8.ini", "utf8", gettext(0,
y, x, y));
  down;
}


//utf8.ini
[utf8]
ア=\u30A2
ィ=\u30A3
イ=\u30A4
ゥ=\u30A5
ウ=\u30A6
ェ=\u30A7
エ=\u30A8
ォ=\u30A9
オ=\u30AA
カ=\u30AB
ガ=\u30AC
キ=\u30AD
ギ=\u30AE
ク=\u30AF
グ=\u30B0
ケ=\u30B1
ゲ=\u30B2
コ=\u30B3
ゴ=\u30B4
サ=\u30B5
ザ=\u30B6
シ=\u30B7
ジ=\u30B8
ス=\u30B9
ズ=\u30BA
セ=\u30BB
ゼ=\u30BC
ソ=\u30BD
ゾ=\u30BE
タ=\u30BF
ダ=\u30C0
チ=\u30C1
ヂ=\u30C2
ッ=\u30C3
ツ=\u30C4
ヅ=\u30C5
テ=\u30C6
デ=\u30C7
ト=\u30C8
ド=\u30C9
ナ=\u30CA
ニ=\u30CB
ヌ=\u30CC
ネ=\u30CD
ノ=\u30CE
ハ=\u30CF
バ=\u30D0
パ=\u30D1
ヒ=\u30D2
ビ=\u30D3
ピ=\u30D4
フ=\u30D5
ブ=\u30D6
プ=\u30D7
ヘ=\u30D8
ベ=\u30D9
ペ=\u30DA
ホ=\u30DB
ボ=\u30DC
ポ=\u30DD
マ=\u30DE
ミ=\u30DF
ム=\u30E0
メ=\u30E1
モ=\u30E2
ャ=\u30E3
ヤ=\u30E4
ュ=\u30E5
ユ=\u30E6
ョ=\u30E7
ヨ=\u30E8
ラ=\u30E9
リ=\u30EA
ル=\u30EB
レ=\u30EC
ロ=\u30ED
ヮ=\u30EE
ワ=\u30EF
ヰ=\u30F0
ヱ=\u30F1
ヲ=\u30F2
ン=\u30F3
ヴ=\u3094
ヴ=\u30F4
ヵ=\u30F5
ヶ=\u30F6

iniファイルリストは実際にはひらがな・漢字・記号等を含めて7千行
近くになりますが、一部だけ載せました。

このようなiniファイルとマクロを作って上のようなsample.txtの
ファイルに対して実行すると、iniファイルで定義されたコード値とは
別のコード値がついてしまうものがあります。分かりやすいように
sample.txtでは「ハヒフヘホ」だけをあげていますが、適当に日本語の
文章をタイプして、それを一文字ずつ改行した後、マクロを実行すると
これ以外にも漢字や記号など、全く別のコード値がついてしまうものが
あります。ちなみに「ハヒフヘホ」の場合、付与されるコード値が
「クゲサジセ」の結果になります。

正しい結果がでるものとそうでないものがあるのはどうしてなの
でしょうか。何かバグっぽい感じもしているので、2.秀丸エディタ&
関連ソフト情報交換の会議室に質問しようかとも考えましたが、
マクロやiniファイルの基本的なことが分かっていないミスかもしれ
ませんので、まずここで質問させていただきます。ご教授よろしく
お願いします。

動作環境は韓国語版XP+英語版秀丸Ver6bです。

[ ]
RE:05094 iniファイルリストによるコードNo.05095
h-tom さん 06/03/10 00:58
 

h-tom です。

>正しい結果がでるものとそうでないものがあるのはどうしてなの
>でしょうか。何かバグっぽい感じもしているので、2.秀丸エディタ&
>関連ソフト情報交換の会議室に質問しようかとも考えましたが、
>マクロやiniファイルの基本的なことが分かっていないミスかもしれ
>ませんので、まずここで質問させていただきます。ご教授よろしく
>お願いします。
iniファイルにアクセスするWindows APIは、大文字と小文字を区別しないから
でしょうね。

   ShiftJISコード
ク 0x83 0x4E
ハ 0x83 0x6E
0x4E -> N
0x6E -> n

大文字と小文字を区別しないので、iniファイルのキーに、2バイト文字を
使うのには無理がある。
いっそのこと、裏でステルス秀丸を開いて、検索させた方がいいかもね。

[ ]
RE:05094 iniファイルリストによるコードNo.05096
Iranoan さん 06/03/10 01:27
 
 マボカルさん今日は、Iranoan です。
> ハ
> ヒ
> フ
> ヘ
> ホ
に対して行ったら、
ハ\u30CF
ヒ\u30D2
フ\u30D5
ヘ\u30D8
ホ\u30DB
に成りました。合っているようですね。
 こちらの環境は、Windows98+IE6.0+秀丸 Ver.6.00β5 です。
 gettext()/getinistr 関数は OS のロケールによって変化するんですかね???

 環境が大きく違うので、私にはこれ以上マクロがどうして上手くいかないこ
とが有るのか、お答えすることは出来ません。ただ何故
> iniファイルリストによるコード値付け
ということになったのか解りません。INI ファイルを用意しなくても、
movetolineno 0, lineno + 1;
while( 1 ){
  #u_code = unicode;
  golineend;
  insert "\\u" + hex( #u_code );
  movetolineno 0, lineno + 1;
  if( code == eof )break;
}
で良いと思いますが。

[ ]
RE:05095 iniファイルリストによるコードNo.05097
マボカル さん 06/03/10 03:47
 
h-tomさん

ご意見ありがとうございます。

>iniファイルにアクセスするWindows APIは、大文字と小文字を区別しないから
>でしょうね。
>
>   ShiftJISコード
>ク 0x83 0x4E
>ハ 0x83 0x6E
>0x4E -> N
>0x6E -> n

そうだとすると、「ハ」の場合はPCの内部的にはどう解釈されている
のでしょうか?私の環境では「ハ」に対して「ク」の文字「\u30AF」
の結果が出るのですが、h-tomさんの説明のような図式でどうして
「ク」の文字に相当する「\u30AF」が検索されてしまっているのかが
分かりません。もう少し勉強しないとよく分かりませんので頑張って
みます。

>大文字と小文字を区別しないので、iniファイルのキーに、2バイト文字を
>使うのには無理がある。
>いっそのこと、裏でステルス秀丸を開いて、検索させた方がいいかもね。

iniファイルについて少し理解が深まりました。
ありがとうございました。

[ ]
RE:05096 iniファイルリストによるコードNo.05098
マボカル さん 06/03/10 03:57
 
Iranoanさん

ご意見ありがとうございます。

>> ハ
>> ヒ
>> フ
>> ヘ
>> ホ
>に対して行ったら、
>ハ\u30CF
>ヒ\u30D2
>フ\u30D5
>ヘ\u30D8
>ホ\u30DB
>に成りました。合っているようですね。
> こちらの環境は、Windows98+IE6.0+秀丸 Ver.6.00β5 です。
> gettext()/getinistr 関数は OS のロケールによって変化するんですかね???

Iranoanさんの環境ではちゃんとした結果が出たのですね。OSの環境
の問題か秀丸英語版の問題でしょうか??正確な結果がでるものと
そうでないものがあるので、やはり気になります。バグでしょうか?
あとで秀丸エディタの開発の方へも報告してみようと思います。

> 環境が大きく違うので、私にはこれ以上マクロがどうして上手くいかないこ
>とが有るのか、お答えすることは出来ません。ただ何故
>> iniファイルリストによるコード値付け
>ということになったのか解りません。INI ファイルを用意しなくても、
>movetolineno 0, lineno + 1;
>while( 1 ){
>  #u_code = unicode;
>  golineend;
>  insert "\\u" + hex( #u_code );
>  movetolineno 0, lineno + 1;
>  if( code == eof )break;
>}
>で良いと思いますが。

何故iniファイルリストによるコード値付けなのかと言えば、答えは
単純です。私の知りうる範囲でのマクロの使えそうなネタとして、
そういうものしかなかったからです・・(汗)。

Iranoanさんのご教授くださったマクロは、早速少し手を加えて使わ
せて頂いております。こんな方法もあったんですね。大変勉強に
なりました。これでとりあえず目的の作業は達成できました。
ありがとうございました。

[ ]
RE:05097 iniファイルリストによるコードNo.05099
h-tom さん 06/03/10 07:51
 

h-tom です。

>>   ShiftJISコード
>>ク 0x83 0x4E
>>ハ 0x83 0x6E
>>0x4E -> N
>>0x6E -> n
>
>そうだとすると、「ハ」の場合はPCの内部的にはどう解釈されている
>のでしょうか?私の環境では「ハ」に対して「ク」の文字「\u30AF」
>の結果が出るのですが、h-tomさんの説明のような図式でどうして
>「ク」の文字に相当する「\u30AF」が検索されてしまっているのかが
>分かりません。もう少し勉強しないとよく分かりませんので頑張って
>みます。
そもそも、"ク"とか"ハ"という文字を探しているわけではないって事。
2バイトの文字列を探しているだけなので、アルファベットにあたる範囲
(0x41〜0x5A、0x61〜0x7A)が同一視されています。

"ク"と"ハ"は1バイト目は同じで、2バイト目は、"N"と"n"にあたります。
大文字小文字を区別しないため、"ク"と"ハ"は区別されません。

で、"ハ"で"ク"が検索されるのは、単純に"ク"が先にあるから。

ちなみに、iniファイルを読む Windows API は、NT系、9x系では動作が
違いますよ。(私が知っているのはタブコードの扱いですが・・・。)

[ ]
RE:05094 iniファイルリストによるコードNo.05100
ENCODINGSHIFTJIS さん 06/03/10 09:58
 
>SJISにある日本語相当の文字に対してユニコードでのコード値を
>付けて、その結果を別の作業に利用しようとしています。いちいち

ちなみに、
Javaの JDK(ソフト開発環境のパッケージ)には ツールが入っています。(昔から)
Java実行のみの JRE には入っていません。

実行例
MSH C:\Program Files\Java\jdk1.6\bin> cat a.txt
ハヒフヘホ
MSH C:\Program Files\Java\jdk1.6\bin> ./native2ascii.exe a.txt
\u30cf\u30d2\u30d5\u30d8\u30db

native2ascii - ネイティブ - ASCII コンバータ
http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/native2ascii.html
 
JDK 5.0 ドキュメント
http://java.sun.com/j2se/1.5.0/ja/docs/ja/index.html

[ ]
RE:05099 iniファイルリストによるコードNo.05101
マボカル さん 06/03/10 12:15
 
h-tomさん

詳しいご説明ありがとうございます。

>そもそも、"ク"とか"ハ"という文字を探しているわけではないって事。
>2バイトの文字列を探しているだけなので、アルファベットにあたる範囲
>(0x41〜0x5A、0x61〜0x7A)が同一視されています。
>
>"ク"と"ハ"は1バイト目は同じで、2バイト目は、"N"と"n"にあたります。
>大文字小文字を区別しないため、"ク"と"ハ"は区別されません。
>
>で、"ハ"で"ク"が検索されるのは、単純に"ク"が先にあるから。

「ハヒフヘホ」の文字をバイナリモードで開いてASCIIコード一覧表を
確認していきながら考えていくと理解できました。いずれも2バイト目
の部分で大文字小文字が区別されず同一視されていたわけですね。

ク4E->N
ハ6E->n

ゲ51->Q
ヒ71->q

サ54->T
フ74->t

ジ57->W
ヘ77->w

セ5A->Z
ホ7A->z

>ちなみに、iniファイルを読む Windows API は、NT系、9x系では動作が
>違いますよ。(私が知っているのはタブコードの扱いですが・・・。)

OSによる動作の違いがあるのであれば、Iranoanさんの動作
環境で上手くいったということも納得いきます。頭の中のもやもやが
なくなりました。ありがとうございました。

[ ]
RE:05100 iniファイルリストによるコードNo.05102
マボカル さん 06/03/10 12:18
 
ENCODINGSHIFTJISさん

ありがとうございます。

>ちなみに、
>Javaの JDK(ソフト開発環境のパッケージ)には ツールが入っています。(昔から)
>Java実行のみの JRE には入っていません。
>
>実行例
>MSH C:\Program Files\Java\jdk1.6\bin> cat a.txt
>ハヒフヘホ
>MSH C:\Program Files\Java\jdk1.6\bin> ./native2ascii.exe a.txt
>\u30cf\u30d2\u30d5\u30d8\u30db
>
>native2ascii - ネイティブ - ASCII コンバータ
>http://java.sun.com/j2se/1.5.0/ja/docs/ja/tooldocs/windows/native2ascii.html
>  
>JDK 5.0 ドキュメント
>http://java.sun.com/j2se/1.5.0/ja/docs/ja/index.html

これまた関連したツールのご紹介ありがとうございます。試してみます。

[ ]