プロが教える店舗&オフィスのセキュリティ対策術

とある開発で、首記の機能が必要になったのですが躓いております。
開発環境は以下の通りです。
 OS:WindowsXP Pro SP2
 言語:MicroSoft VisualBasic2005 ExpressEdition

テキストボックスにハングル、または中国語の文字を手入力し
内部処理で入力された文字コードよりKSコード、GBKを
取得するようなことをしたいのです。
(Shift化コードではなく、通常のコードです)

実験過程で、
・VBのテキストボックスに入力された文字コードを取得する為にはAscW関数を使用すること。
・取得できる文字コードはUnicodeであること。
以上が解決しております。
ですが、KSコードや、GBKのマップ構造がわからない為
Unicode To KSコード、GBKの変換ができずに頓挫しております。

S-JIS、JISは両方とも規則性のあるマッピングであったので変換処理がロジック化できたのですが、
ハングル、中国語にも同じようなロジックが通用しますでしょうか?

また、KSコード、GBKのマップ構造に関するサイトのURLなど御存知でしたら
御教示頂ければ幸いです。よろしく御願い致します。

A 回答 (3件)

> 全角文字は2Bytesのはずなのですが、CP52936とCP50225で6Bytes、8Bytes取得してしまいました。



> 6Bytes文字コード中には0x3021、8Bytes文字コード中には0x6439があり、
>一見、取得したい値が含まれているようにも見えます・・・。この文字コードは何なのでしょうか?

エンコーディング固有のエスケープシーケンスが入っているようです。
昨日の回答(#1)で紹介したリンクにもありますが、
中国語で使われるHZというエンコーディング(CP52936)
では、他の文字コードとの区別を明確にするために

> この方法は ISO-2022-JP に似ていますが, エスケープシーケンスのかわりに
> ~{ で GB2312 の開始を, ~} で ASCII の開始(GBの終了)を示します。
> また ~ で行が終わっている場合は, 次の行とつながっていることを示します。
> ASCII の ~ 自体は ~~ で表します。詳細は RFC1842 を見てください。

ということをしています。

CP50225の方は 1B2429430E64390F →
ESC $ ) C SO 0x64 0x39 SI ですね。
0x64 と 0x39 が本当に欲しい部分で、
その他はエンコーディング指定等のエスケープシーケンスです。

ところで、GB 18030はUnicodeを丸ごと飲み込むような
巨大な文字集合なので、

> 全角文字は2Bytesのはずなのですが

2バイトに収まるとは限りません。
つかこの辺は昨日紹介したリンク先に書いてあることなんですが
読んでもらえませんでした?

RFC 1557 - Korean Character Encoding for Internet Messages (日本語訳)
http://www.cam.hi-ho.ne.jp/mendoxi/rfc/rfc1557j. …

CJK CHARACTER SET STNADARDS CLASSIFICATION. VERSION 0.1
http://tagunov.tripod.com/cjk.html#A1.2.4

http://www.iana.org/assignments/charset-reg/GBK

GBコードについて【メモ】
http://www.antenna.co.jp/ml/back/Chinese/gb_char …
    • good
    • 0
この回答へのお礼

リンク先を拝見致しました。日本のJISコードのようなルールの文字コードは
中国語(HZ)CP52936と韓国語(ISO-2022-KR)なのですね。

考えてみれば該当国語へのシフトやASCIIへシフトするための
エスケープシーケンスが入るのは当然のことなのですが
全角文字=2バイト文字という概念に捕らわれてすっかり忘れていました・・・。

御指摘の通り、上記内容の記述を見落としておりました。
GBコードには4バイト文字なんてのもあるんですね。勉強になりました。
ありがとうございました。以上で質問を締めさせて頂きます。

お礼日時:2007/03/07 13:46

お世話になります。



単純に、これではだめなんでしょうか。

Dim bytes As Byte() = System.Text.Encoding.Default.GetBytes(Me.TextBox1.Text)

' 韓国語
Dim kr1 As String = System.Text.Encoding.GetEncoding(51949).GetString(bytes) ' 韓国語 (EUC-KR, KS X 1001)
Dim kr2 As String = System.Text.Encoding.GetEncoding(50225).GetString(bytes) ' 韓国語 (ISO-2022-KR)
Dim kr3 As String = System.Text.Encoding.GetEncoding(949).GetString(bytes) ' 韓国語 (Windows, UHC)

' 中国語
Dim ch1 As String = System.Text.Encoding.GetEncoding(51936).GetString(bytes) ' 簡体字中国語 (GB2312)
Dim ch2 As String = System.Text.Encoding.GetEncoding(54936).GetString(bytes) ' 簡体字中国語 (GB18030)
Dim ch3 As String = System.Text.Encoding.GetEncoding(52936).GetString(bytes) ' 簡体字中国語 (HZ)
Dim ch4 As String = System.Text.Encoding.GetEncoding(936).GetString(bytes) ' 簡体字中国語 (Windows, GBK)

GetEncoding の引数はこちらを参考にしました。
http://www.hitachi-to.co.jp/prod/prod_2/inter/em …
    • good
    • 0
この回答へのお礼

naganaga_001さん、ありがとうございます。
例示して頂いたコードを元に、各コードページ毎にByte単位で
各国語の文字コードを取得してみました。

テキストボックスに「阿」を入力し、以下のコードを実行しました。
' 韓国文字コード
Dim krb1 As Byte() = System.Text.Encoding.GetEncoding(51949).GetBytes(Me.TextBox1.Text) ' 韓国語 (EUC-KR, KS X 1001)
Dim krb2 As Byte() = System.Text.Encoding.GetEncoding(50225).GetBytes(Me.TextBox1.Text) ' 韓国語 (ISO-2022-KR)
Dim krb3 As Byte() = System.Text.Encoding.GetEncoding(949).GetBytes(Me.TextBox1.Text) ' 韓国語 (Windows, UHC)

' 中国語文字コード
Dim chb1 As Byte() = System.Text.Encoding.GetEncoding(51936).GetBytes(Me.TextBox1.Text) ' 簡体字中国語 (GB2312)
Dim chb2 As Byte() = System.Text.Encoding.GetEncoding(54936).GetBytes(Me.TextBox1.Text) ' 簡体字中国語 (GB18030)
Dim chb3 As Byte() = System.Text.Encoding.GetEncoding(52936).GetBytes(Me.TextBox1.Text) ' 簡体字中国語 (HZ)
Dim chb4 As Byte() = System.Text.Encoding.GetEncoding(936).GetBytes(Me.TextBox1.Text) ' 簡体字中国語 (Windows, GBK)

結果は以下の通りでした。

中国語のコードページに従った文字コード
CP51936:0xB0A2 (2Bytes)
CP54936:0xB0A2 (2Bytes)
CP52936:0x7E7B30217E7D (6Bytes)
CP936:0xB0A2 (2Bytes)
韓国語のコードページに従った文字コード
CP51949:0xE4B9 (2Bytes)
CP50225:0x1B2429430E64390F (8Bytes)
CP949:0xE4B9 (2Bytes)

全角文字は2Bytesのはずなのですが、CP52936とCP50225で6Bytes、8Bytes取得してしまいました。

6Bytes文字コード中には0x3021、8Bytes文字コード中には0x6439があり、
一見、取得したい値が含まれているようにも見えます・・・。この文字コードは何なのでしょうか?

引き続き、私も調査を続けます。
CP52936、CP50225の仕様についてご存知の方がいらっしゃいましたらご教示頂けましたら幸いです。

お礼日時:2007/03/07 10:40

shift化でないという但し書きがあるので、ひょっとしたら


JIS X 0208でいうところの 区点コードとかいわゆるJISコードでの
値が欲しいということでしょうか?

「GBK」という名前でいうと、質問者さんが言うところの
「shift化」した値を集めたエンコーディングだと思うのですが。

East Asian Character Sets Overview: Chinese
http://www.asahi-net.or.jp/~EZ3K-MSYM/charsets/c …

韓国語のコードはよく知りませんが、事情としては同じだと思います。

East Asian Character Sets Overview: Korean
http://www.asahi-net.or.jp/~EZ3K-MSYM/charsets/c …
    • good
    • 0
この回答へのお礼

>shift化でないという但し書きがあるので、ひょっとしたら
>JIS X 0208でいうところの 区点コードとかいわゆるJISコードでの
>値が欲しいということでしょうか?
仰るとおり、日本のSJIS→JIS変換の様なことを中国語、韓国語でも
やりたいと思っております。

GBKという名前はsakusaker7さんのリンクされているページを拝見すると
間違っていますね。申し訳ありません。
韓国のKSコードについては、ShiftKSコードというものがあるようです。

引き続き、変換の為に役立つ資料等がありましたらよろしくお願い致します。

お礼日時:2007/03/06 17:59

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!