• ベストアンサー

文字コード変換(Unicode To KSコード、GBK)方法?

とある開発で、首記の機能が必要になったのですが躓いております。 開発環境は以下の通りです。  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など御存知でしたら 御教示頂ければ幸いです。よろしく御願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.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.html 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_charset_memo.htm

kaki_1980
質問者

お礼

リンク先を拝見致しました。日本のJISコードのようなルールの文字コードは 中国語(HZ)CP52936と韓国語(ISO-2022-KR)なのですね。 考えてみれば該当国語へのシフトやASCIIへシフトするための エスケープシーケンスが入るのは当然のことなのですが 全角文字=2バイト文字という概念に捕らわれてすっかり忘れていました・・・。 御指摘の通り、上記内容の記述を見落としておりました。 GBコードには4バイト文字なんてのもあるんですね。勉強になりました。 ありがとうございました。以上で質問を締めさせて頂きます。

その他の回答 (2)

回答No.2

お世話になります。 単純に、これではだめなんでしょうか。 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/emk/help/TextEncoder/Charset.htm

kaki_1980
質問者

お礼

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の仕様についてご存知の方がいらっしゃいましたらご教示頂けましたら幸いです。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

shift化でないという但し書きがあるので、ひょっとしたら JIS X 0208でいうところの 区点コードとかいわゆるJISコードでの 値が欲しいということでしょうか? 「GBK」という名前でいうと、質問者さんが言うところの 「shift化」した値を集めたエンコーディングだと思うのですが。 East Asian Character Sets Overview: Chinese http://www.asahi-net.or.jp/~EZ3K-MSYM/charsets/cjk-c.htm 韓国語のコードはよく知りませんが、事情としては同じだと思います。 East Asian Character Sets Overview: Korean http://www.asahi-net.or.jp/~EZ3K-MSYM/charsets/cjk-k.htm

kaki_1980
質問者

お礼

>shift化でないという但し書きがあるので、ひょっとしたら >JIS X 0208でいうところの 区点コードとかいわゆるJISコードでの >値が欲しいということでしょうか? 仰るとおり、日本のSJIS→JIS変換の様なことを中国語、韓国語でも やりたいと思っております。 GBKという名前はsakusaker7さんのリンクされているページを拝見すると 間違っていますね。申し訳ありません。 韓国のKSコードについては、ShiftKSコードというものがあるようです。 引き続き、変換の為に役立つ資料等がありましたらよろしくお願い致します。

関連するQ&A

  • Unicodeの文字がどれか、調べたいです

    ある文章をメモ帳で保存しようとしたら「このファイルはANCIテキストファイルで保存すると失われてしまうUnicode形式の文字を含んでいます。Unicodeの情報を保存するには、[文字コード]から[Unicode]を選択してください」と出ました。どれがUnicodeの文字なのかを調べる方法を探しましたが、アテになるのが全くありません。また、「[文字コード]から[Unicode]を選択する」という言葉の意味も分かりません。文字コード表を開きましたが、その後詰まりました。 限りなく分かりやすい説明をお願いします!

  • リダイレクトする時の文字コードをUnicodeに

    現在、VisualStudioで、システムコールの標準出力結果をリダイレクトしてファイルに保存する プログラムを書いています。 _tsystem(command); のような感じで、commandには "hogehoge > hoge.txt"のように入ります。 ※command はTCHAR この出力結果が、Shift-Jisになっているようで、Shift-Jisだと日本語が文字化けせずに表示されるのですが、Unicode UTF-16にすると文字化けしてしまいます。 Unicode UTF-16とかUnicode UTF-8など文字コードを指定してリダイレクトできないのでしょうか。 ちょっと調べてみましたがうまく見つかりませんでした。

  • 文字コード体系について

    WINDOWS95の文字コードはシフトJISのみに対応していたと思うのですが、 このときアメリカなど海外で販売されていた WIN95の文字コードは何だったのかご存じありませんか? WINDOWSxpの文字コードはシフトJISと、unicode対応してると思うのですが、 海外で販売されている物は unicodeのみに対応してるのでしょうか。 それとも他に特殊な文字コード体系を持っているのでしょうか。

  • 文字コードについて

    文字コードについて調べています!! ASCIIやunicode,jis,shift-jisなど色々なコードがあると思うのですが、 そもそも、パソコンには上記のコードや、表示⇒エンコード で選ぶことの 出来る、各文字コードの文字コード表が格納されているんでしょうか? ちょっとまだ勉強を始めたばかりで曖昧な質問になってしまったのですが、この疑問をどうして解消したくて… 色々と検索しても上記なようなことは探し出すことが出来なかったので どなたか教えてください!! よろしくお願いします!!

  • VBAでテキストを書き出す時に、文字コードを指定するには?

    VBAでテキストを書き出す時に、たとえば、 shift_jisなど、文字コードを指定して書き出すには どうすればいいのでしょう? unicodeはFSOを使えばいいことはわかったのですが…。

  • 「C#」文字コードの取得&文字変換

    C#で文字コードを調べるプログラムを作成しています。 そこで2つ質問をさせてください。 1つ目(文字コード調べ) TextBoxに漢字を入力して,各エンコーディングの文字コードを調べるときに,UNICDEの場合, Encoding enc_default = Encoding.GetEncoding(932); string input = tb_input.Text; byte[] byte_input = enc_default.GetBytes(input); string outtext_unicode = ""; Encoding enc_unicode = Encoding.Unicode; byte[] byte_unicode = Encoding.Convert(enc_default,enc_unicode, byte_input); foreach (byte b in byte_unicode) { outtext_unicode += string.Format("{0:X}", (int)b); } tb_output_unicode.Text = outtext_unicode; とすると,調べたい文字コードがLE(リトルエディアン)で出力されます。これをBE(ビッグエディアン)で出力されるにはどうしたらよいでしょうか? ご存知の方がいらっしゃいましたら,ぜひ教えてください。 よろしくお願いいたします。 2つ目(文字コードから文字を取得する) 上記の質問と逆のパターンで,TextBoxに文字コードを入力してもらい,人間が読める文字に変換する場合下記のようなコードを書くと, string codePoint_string = tb_output_unicode.Text; int codePoint = int.Parse(codePoint_string); char c = (char)codePoint; tb_input.Text = Convert.ToString(c); ASCIIの文字コードを入力した場合には,きちんと変換してくれるのですが,漢字の文字コードを入力すると,FormatExceptionが発生します。 何か勘違いをしているのかもしれませんが,いまいちやり方が創造できません。 こちらも,ご存知の方がいらっしゃいましたら,ご教示願います。

  • Unicode-Japaneseでの絵文字変換

    Unicode-Japaneseを使って別キャリアの絵文字を相互変換しようと 思っています。 ソースはShift_JISで作成、画面表示もShift_JISです。 $in{text}はformからの受取です。Softbankの3G端末でテストしています。 入力を受け取り、一度、utf8に変換後、また元に戻しているつもりですが、 $str2を画面に表示しても、絵文字が化けてしまっています。 (普通のテキストなら化けません) 何か考え方が間違っているでしょうか。 以下、変換して戻している部分です。 うまくいった場合には、$str1 をデータとして保存しようと思っています。 $s = Unicode::Japanese->new($in{text},"sjis-jsky"); $str1 = $s->conv("utf8"); $s = Unicode::Japanese->new($str1,"utf8"); $str2 = $s->conv("sjis-jsky"); よろしくお願いいたします。

  • VBScript ASC関数:文字エンコード(Unicode→Shif

    VBScript ASC関数:文字エンコード(Unicode→Shift-JIS)多対一変換について 初めての質問です。 よろしくお願いいたします。 【質問】 VBScriptのASC関数で文字をShift-JISコード 表示した場合、多対一変換され、文字変換が起こります。 この多対一変換をしないように、もし対応する文字が無い場合は、 ?になるようにしたいと思いますが、良い方法は無いでしょうか? 【現象】 ラテン1補助のÀ文字(A`)の UnicodeとSift-JISコードのマップ対応が原因のようです。 具体的には、Àは、 Unicodeでは(A`)だが、Sift-JISコードでは(A) にマップされているのです。 IMEパッドの文字コードをみるとわかります。 以下のサイトを見ると、さらに詳しく載っています。 ▼参考サイト 第7回 Unicodeからの多対一の変換[前編] http://gihyo.jp/admin/serial/01/charcode/0007 そこで、APIのwidechartomultibyte関数の wc_no_best_fit_charsを設定したエンコード方式 を使用すれば解決するというところまでは、 わかってきたのですが、これをVBScriptのASC関数 と同じ動きをするように関連付けるか、別途プログラム を作る方法がわからず困っています。 わかる方いらしたら、ご教授下さい。 よろしくお願い致します。

  • MFC:リッチエディットからUnicode文字列を受け取りたい

    MFCのダイアログベースでプロジェクトを作成 ↓ プロジェクトのプロパティで「マルチバイト文字セットを使用する」を「Unicode文字セットを使用する」に変更 ↓ エディットボックスとリッチエディット2.0を適当に配置 ↓ エディットボックスとリッチエディット2.0それぞれにコントロール変数を追加 ↓ InitInstance()内に AfxInitRichEdit2(); を追加 ↓ あとは適当なところでエディットボックスとリッチエディット2.0それぞれにGetWindowText関数を使って、記入内容を取得します。     すると、エディットボックスではUnicodeの文字を入れても文字化けしないのに対し、リッチエディット2.0では文字化けしてしまいます。 例えば“Å”の半角文字を(Unicode紹介サイトからコピペする等して)入力すると、エディットボックスではそのまま“Å”なのに、リッチエディット2.0では“A”になります。   ※入力している段階では“Å”と表示されています。GetWindowText関数で取得すると“A”になってしまいます。     リッチエディット2.0からUnicode文字を正常に受け取れる方法はありませんでしょうか。

  • ユニコードのサロゲートペア文字の内部コードについて

     Windows Vista から、文字コードがJIS2004対応となり、ユニコード文字の中に、カスケードペアの文字が存在すると聞き及んでいますが、当方は、まだ XP のままで、また、JIS2004対応のMSフォントもインストールしておりません。  1点お教えください。  カスケードペアは、xD800~xDBFF 及び、xDC00~xDFFF の2バイトずつ、4バイトで1文字を表現するそうですが、 たとえば、ユニコードx2000B(丈の右上に犬のように点が付いた文字)の場合、計算すると、xD840 + xDC0B であらわせるようですが、リトルエンディアンでは、   x40D80BDC となるのでしょうか。  それとも、   x0BDC40D8 となるのでしょうか。 上段になるような気がするのですが、根拠がはっきりしません。  宜しくお願い致します。