char taka[100];
WideCharToMultiByte(50221, 0, L"髙", -1, taka, 100, NULL, NULL);
Windowsで、上のルーチンで「髙」をJISコードに変換すると、
「1b 24 28 44 74 29 1b 28 42 00」というバイト列になりました。
「1b 24 28 44」はJIS X 0212、「1b 28 42」はアスキー文字のエスケープ文字で、
途中の「74 29」というバイト列が「髙」を表すものだと理解しました。
ところが、テキストエディタなどでこの文字のJISコードを表示させると、0x7c62となります。
「髙」が本来JISコードにないことは理解しているのですが、
この0x7429というバイト列はどういう意味で、なぜ0x7c62にならないのでしょうか?
JISだと「1B 24 42 7C 62 1B 28 42」では?
コメントありがとうございます。
JIS X 0212を表すエスケープ文字が入ってくるのがおかしいのではとも思うのですが、
上に書いたようにWideCharToMultiByteを使うと、そのようなバイト列になるようです。
「1B 24 42 7C 62 1B 28 42」が返ってくるような指定方法があるのでしょうか。
以下試した結果を記載ください。
- 引数lpDefaultChar, lpUsedDefaultCharも指定
- 戻り値も取得し0ならGetLastErrorでエラーコードを取得
おそらくERROR_INVALID_PARAMETERで変換失敗すると思います。
まず、
https://learn.microsoft.com/ja-jp/windows/win32/intl/code-page-identifiers
より50221はcsISO2022JPのことであり、所謂JISコードの派生であることが分かります。
Microsoftからはこれ以上の情報の提供がありません。
他方所謂JISコード(ISO-2022-JP)には以下から
https://ja.wikipedia.org/wiki/ISO-2022-JP
いくつかの派生があることが分かっています。
ISO-2022を知ると分かりますが、そのサブセットでエスケープシーケンスが被ったりしません。
「1b 24 28 44」はRFC2237
https://datatracker.ietf.org/doc/html/rfc2237
によると、JIS X 0212-1990とのことなので、JIS X 0212は確定だと思います。
そして「74 29」は0x20ずつ引いて区点にすると84区9点となり、
https://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0212/index.html
によるとJIS X 0212に存在しないことになります(JISでpdfを見てもいいのですが、ユーザー登録したくないので私は見てません)。ユーザー登録してPDFを見てもいい人は見て確認すれば何か分かるかもしれませんね。
> ところが、テキストエディタなどでこの文字のJISコードを表示させると、0x7c62となります。
そのエディタでJISで保存したファイルをバイナリエディタで開き、バイトコードを確認してください。
たぶん「1B 24 42 7C 62 1B 28 42」になっていると思いますが。
あとは以下などを参考に、いろいろ調べてみてください。
https://sakura-editor.github.io/help/HLP000271.html
> - 引数lpDefaultChar, lpUsedDefaultCharも指定
> - 戻り値も取得し0ならGetLastErrorでエラーコードを取得
コメントありがとうございます。
lpDefaultCharとlpUsedDefaultCharをNULLのまま、戻り値を確認してみたところ、
WideCharToMultiByteの戻り値は10で、成功扱いになっているようです。
ちなみに、lpDefaultCharとlpUsedDefaultCharを指定してみようとしたのですが、
BOOL bUsedDefaultChar = FALSE;
int result = WideCharToMultiByte(50222, 0, L"髙", -1, taka, 100, "?", &bUsedDefaultChar);
と書いてみても、GetLastErrorの値は87(パラメータが不正)となってしまいます。
「髙」の代わりに「高」などの文字を入れてみても同じです。
指定の仕方が間違っているのでしょうか。
> dameoさん
> そして「74 29」は0x20ずつ引いて区点にすると84区9点となり、
> https://www.asahi-net.or.jp/~ax2s-kmtn/ref/jisx0212/index.html
> によるとJIS X 0212に存在しないことになります
> can110さん
> そのエディタでJISで保存したファイルをバイナリエディタで開き、バイトコードを確認してください。
> たぶん「1B 24 42 7C 62 1B 28 42」になっていると思いますが。
お二方コメントありがとうございます。
テキストエディタで「髙」だけを打ち込んで、JISとして保存し、
バイナリエディタで見てみたところ、「1B 24 42 7C 62 1B 28 42」となっていました。
となると、WideCharToMultiByteが正しい動作をしていないということになるのでしょうか?
その場合、任意の文字列をJISコードに変換するには、他にどういう方法がありますでしょうか?
> WideCharToMultiByteが正しい動作をしていないということになるのでしょうか?
いいえ
> テキストエディタなどでこの文字のJISコードを表示させると、0x7c62となります。
・どのようなエディタで、どんな文字コードで記載したうえで、どんな方法を用いて確認を行いましたか?
> どのようなエディタで、どんな文字コードで記載したうえで、どんな方法を用いて確認を行いましたか?
秀丸エディタに「髙」の文字を貼り付けて、「文字コード表示」のダイアログで確認したところ、
JIS: 0x7C62
と表示されました。
また、JIS形式で保存してから開き直しても、同じ文字コードになっていることも確認しました。
では、「0x7c62のほうが正しい」と考える根拠は何でしょうか?
> では、「0x7c62のほうが正しい」と考える根拠は何でしょうか?
0x7c62で調べるとそれなりに情報が出てきて、ファイルにもそのように保存されるのに、
0x7429だとなにも情報が出てこないので、WideCharToMultiByteで返ってくる0x7429はどういう意味なんだと疑問に思いました。
「髙」(U+9AD9)の該当しそうなSJISコードが2つあるのですね。JISコードの割り当てはないと書いてありましたが
2つのSJISコードEEE0とFBFC
EEE0の方は、NEC選定IBM拡張文字って書いてありましたが、EEE0は単純計算するとJISコード7C62になりますが、FBFCの方は、EFを超えているので計算できない。
EEE0は、恐らくNEC選定IBM拡張文字って書いてるから特殊な方なのでしょうか
エディター(内部がUNICODEのエディタ)で、SJISで保存するとFBFCのコードになります。
SJISコードでJIS X 208の区点を計算する方法はありますが、JIS X 212はありません。
質問者(と回答者)がISO-2022を理解してからでないと話が出来ないと思いますよ。
回答2件
あなたの回答
tips
プレビュー