C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 環境依存文字をチェックしたい


(過去ログ 82 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■48668 / inTopicNo.1)  環境依存文字をチェックしたい
  
□投稿者/ 区絵里瑛太 (1回)-(2010/04/12(Mon) 10:08:33)

分類:[VB.NET/VB2005 以降] 

よく、丸文字の数字や、株式会社の略称(株)を1文字にしたものなど、IMEで変換すると「環境依存文字」と表示される文字がありますが、
IMEで表示される「環境依存文字」の定義とは何でしょうか?
また、これら環境依存文字がテキストに含まれているかどうかをチェックするには、どうしたらよいでしょうか?
やりたいことは、環境依存文字がテキストに含まれている場合、その文字をメッセージとして表示してアラートを表示させるというものです。
VB2008のExpressを使用しています。
よろしくおねがいします。
引用返信 編集キー/
■48669 / inTopicNo.2)  Re[1]: 環境依存文字をチェックしたい
□投稿者/ はつね (1249回)-(2010/04/12(Mon) 10:40:26)
No48668 (区絵里瑛太 さん) に返信
> よく、丸文字の数字や、株式会社の略称(株)を1文字にしたものなど、IMEで変換すると「環境依存文字」と表示される文字がありますが、
> IMEで表示される「環境依存文字」の定義とは何でしょうか?

JISなどのコード系に含まれていないメーカー独自の文字など。


> また、これら環境依存文字がテキストに含まれているかどうかをチェックするには、どうしたらよいでしょうか?

1文字づつJISなどのコード系に含まれているかを判断します。
文字コードの値の範囲や正規表現などを使います。

宣伝ですが、2010/05/15にオラクル社員の方が文字コードについて詳しく解説してくれるセッションがありますよ。
http://www.wankuma.com/seminar/20100515tokyo47/Default.aspx


引用返信 編集キー/
■48682 / inTopicNo.3)  Re[2]: 環境依存文字をチェックしたい
□投稿者/ 区絵里瑛太 (2回)-(2010/04/12(Mon) 13:51:48)
No48669 (はつね さん) に返信
> 1文字づつJISなどのコード系に含まれているかを判断します。
> 文字コードの値の範囲や正規表現などを使います。

はつね 様、ご回答ありがとうございます。
ところで、使用している言語はVBなのですが、VB内部では文字コードをUNICODEで扱っているとのことですが、
それがJISなどのコード系に含まれているかどうかはどのように判断すればよいのでしょうか?
・UNICODE→JISに変換できるかどうかでチェック?
・それともUNICODE→JISの対応表を作成して、JISに登録されていない範囲に含まれているかどうかをチェック?
 (UNICODE→JISの対応表って、どこかのサイトに掲載されているでしょうか?)

コード体系について、もう少し勉強したいと思いますが、参考になるサイトでも結構ですので教えて頂きたく、よろしくおねがいします。
引用返信 編集キー/
■48686 / inTopicNo.4)  Re[1]: 環境依存文字をチェックしたい
□投稿者/ 魔界の仮面弁士 (1610回)-(2010/04/12(Mon) 15:11:29)
No48668 (区絵里瑛太 さん) に返信
> また、これら環境依存文字がテキストに含まれているかどうかをチェックするには、どうしたらよいでしょうか?

自前で、各文字のコード範囲をチェックしていくことになると思います。

最初、EncoderExceptionFallback でチェックできるかな…と思ったのですが、
今回の目的には合わないかも。

Imports System
Imports System.Text
Imports System.Collections.Generic
Public Class Form1
    Private List As New List(Of Encoding)
    Private fmt As String = "{0} {1,5}『{2}』"
    Private Sub Form1_Load() Handles Me.Load
        TextBox1.Dock = DockStyle.Top
        ListBox1.Dock = DockStyle.Fill
        ListBox1.IntegralHeight = False
        ListBox1.Font = New Font("MS Gothic", 9)
        ListBox1.BackColor = Me.BackColor
        Dim encFB As New EncoderExceptionFallback()
        Dim decFB As New DecoderReplacementFallback()

        List.Add(Encoding.GetEncoding(932, encFB, decFB))
        List.Add(Encoding.GetEncoding(1200, encFB, decFB))
        List.Add(Encoding.GetEncoding(1201, encFB, decFB))
        List.Add(Encoding.GetEncoding(20290, encFB, decFB))
        List.Add(Encoding.GetEncoding(20932, encFB, decFB))
        List.Add(Encoding.GetEncoding(50220, encFB, decFB))
        List.Add(Encoding.GetEncoding(50221, encFB, decFB))
        List.Add(Encoding.GetEncoding(50222, encFB, decFB))
        List.Add(Encoding.GetEncoding(51932, encFB, decFB))
        List.Add(Encoding.GetEncoding(65001, encFB, decFB))
    End Sub
    Private Sub TextBox1_TextChanged() Handles TextBox1.TextChanged
        ListBox1.BeginUpdate()
        ListBox1.Items.Clear()
        Try
            For Each enc In List
                Try
                    enc.GetByteCount(TextBox1.Text)
                    ListBox1.Items.Add(String.Format(fmt, _
                        "○", enc.CodePage, enc.EncodingName))
                Catch ex As EncoderFallbackException
                    ListBox1.Items.Add(String.Format(fmt, _
                        "×", enc.CodePage, enc.EncodingName))
                    ListBox1.Items.Add(vbTab & String.Format( _
                        "({0}){1}", TextBox1.Text(ex.Index), ex.Message))
                End Try
            Next
        Finally
            ListBox1.EndUpdate()
        End Try
    End Sub
End Class

引用返信 編集キー/
■48705 / inTopicNo.5)  Re[3]: 環境依存文字をチェックしたい
□投稿者/ 魔界の仮面弁士 (1611回)-(2010/04/12(Mon) 22:29:06)
No48668 (区絵里瑛太 さん) に返信
> IMEで表示される「環境依存文字」の定義とは何でしょうか?
おそらくは、Web や メールで日本語を扱う場合を想定し、その範囲内において
 『他の環境に持っていくと、正しく再現できない(可能性が高い)文字』
を説明するために表示されているのだと思います。

それをあえて定義するなら、他の文字集合に存在しない文字が使われていた場合や、
文字集合の違いによって、変換時に文字が一対一に対応しない場合などでしょうか。

MS-IME のバージョンによって、環境依存文字の範囲も微妙に異なりますし、
そこに符号化の話も絡んでくるので、意外とややこしい話になりそうですが。


> 丸文字の数字や、株式会社の略称(株)を1文字にしたものなど
これらの文字は、Windows から Macintosh 環境にデータを持っていった場合に、
別の文字で表示されてしまう可能性があるため、環境依存とされています。

たとえば、Windows の Shift_JIS (コードページ 932)においては、
 8740 → 「丸付き数字の "1"」 → ChrW(&H2460)
 8741 → 「丸付き数字の "2"」 → ChrW(&H2461)
 8742 → 「丸付き数字の "3"」 → ChrW(&H2462)

 8754 → 「ローマ数字の "I"」 → ChrW(&H2160)
 8755 → 「ローマ数字の "II"」 → ChrW(&H2161)
 8756 → 「ローマ数字の "III"」→ ChrW(&H2162)
のように割り当てられていますが、Macintosh の Shift_JIS では
 8740 →「"(日)"」→ ChrW(&H3230)
 8741 →「"(月)"」→ ChrW(&H322A)
 8742 →「"(火)"」→ ChrW(&H322B)

 8754 →「"(特)"」→ ChrW(&H3235)
 8755 →「"(企)"」→ ChrW(&H323D)
 8756 →「"(協)"」→ ChrW(&H323F)
となっているため、同じバイナリが、一部だけ別の文字で表示されてしまう可能性があります。
(ちなみに Mac の場合、丸付き数字は 8540〜、ローマ数字は 859F〜です)


また、今回の例に挙げられた (株) など以外にも、Unicode では表現できるが、
Shift_JIS (というか CP932) で表現できない文字に関しても、MS-IME では
環境依存文字として表現されています。

たとえば "吉" の字。これには、{士/口} の他に {土/口} の字形もあります。

{士/口}は Unicode では 5409、Shift_JIS では 8B67に割り当てられています。一方
{土/口}は Unicode 上で 20BB7 ですが、Shift_JIS には割り当てられていません。

なので、MS-IME で {土/口}(いわゆる "つちよし")を入力しようとすると、
最近のバージョンでは「環境依存文字 (Unicode)」と表示されることになります。


それ以外にも、私用領域(外字)にある文字や、電子メールで問題となりやすい「半角カナ」、
そのほか、拡張かな(たとえば {か゜}の文字)であるとか、Vista で字形が変更された文字群も、
ある意味では環境依存文字と呼べるかと思います。


No48682 (区絵里瑛太 さん) に返信
> それがJISなどのコード系に
そもそも「環境依存文字」の定義自体が曖昧ですので、それらをプログラム的に判断する前に、
まずは、質問文中にある『JISなど』というのが、具体的に何と何を示しているかを
明らかにしておいた方が、開発する(ために事前調査する)際に楽になると思います。

さらに言えば、"コード系" という表現も曖昧かと思いますので、可能であれば、
文字集合とコードページ、文字符号化などの違いをおさえておくと良いかと。


> ・UNICODE→JISに変換できるかどうかでチェック?
変換できないものは環境依存文字と言えますが、その逆は成り立ちません。
変換できるが環境依存文字として挙げられている文字もあるためです。


>(UNICODE→JISの対応表って、どこかのサイトに掲載されているでしょうか?)
Unicode文字のマッピングについては、ユニコード・コンソーシアムで定義されています。
たとえば Shift_JIS なら、
http://unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFTJIS.TXT
http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT
などの資料が参考になるかと思います。
http://unicode.org/Public/ 配下には、他にもいろいろな資料があります。


> VB内部では文字コードをUNICODEで扱っているとのことですが、
> それがJISなどのコード系に含まれているかどうかはどのように判断すればよいのでしょうか?
何が環境依存文字に相当するかという明確な定義があるわけではありませんが、
bing や google で「環境依存文字」あるいは「機種依存文字」などのキーワードで
検索してみると、幾つか具体的な一覧が見つかるかと思います。

それらを元に、機種依存文字の一覧を保持しておき、それと比較してみて下さい。
とはいえそれだけでは網羅しきれないでしょうから、範囲指定で拾う事も必要でしょう。


で。範囲指定で判定する場合には、

(a) 元データが String で保持されている (TextBox からの入力時など)
(b) 元データが "JISなど" のバイナリである (CSV ファイルからの取り込みなど)
(c) 元データが Unicode のバイナリである

のいずれに相当するのかによって話が微妙に異なるかとは思いますが、とりあえず
Unicode からの変換が必要なら、System.Text.Encoding クラスや Asc関数/Chr関数を用いて
変換するという手が使えます。


とはいえ、この Unicode との相互変換が別の問題を引き起こす場合もありますので、
対象データが (b)の場合には、できるだけ元データのまま取り扱ったほうが良いと思います。

たとえば CP932 では、平方根記号『√』が 8795 と 81E3 の二箇所に割り当てられています。
しかし Unicode においては 221A の一箇所にしか割り当てられていません。
そのため、Unicode と Shift_JIS の相互変換時に問題が起きる可能性があります。
http://support.microsoft.com/kb/170559/ja
http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT
引用返信 編集キー/
■48707 / inTopicNo.6)  Re[2]: 環境依存文字をチェックしたい
□投稿者/ Jitta on the way (604回)-(2010/04/12(Mon) 22:43:50)
No48686 (魔界の仮面弁士 さん) に返信

Unicode で入力されるとして、JIS、Shift_JIS、EUC 等の「含まれているか調べたいコード」に変換し、Unicode に再変換して、元の文字と同じか比べる…じゃ、ダメですか?
表示したいところで表示できれば、環境依存でも問題はないでしょうから。
まぁ、字体が変わったものは、扱いを変える必要があるかも知れませんが。
引用返信 編集キー/
■48710 / inTopicNo.7)  Re[3]: 環境依存文字をチェックしたい
□投稿者/ 魔界の仮面弁士 (1612回)-(2010/04/12(Mon) 23:35:16)
No48707 (Jitta on the way さん) に返信
> Unicode で入力されるとして、JIS、Shift_JIS、EUC 等の「含まれているか調べたいコード」に変換し、
> Unicode に再変換して、元の文字と同じか比べる…じゃ、ダメですか?

No48686 のコードでいうと、Try ブロックの中を
 If TextBox1.Text = enc.GetString(enc.GetBytes(TextBox1.Text)) Then
  ListBox1.Items.Add(String.Format(fmt, "○", enc.CodePage, enc.EncodingName))
  ListBox1.Items.Add(vbTab & enc.GetString(enc.GetBytes(TextBox1.Text)))
 Else
  ListBox1.Items.Add(String.Format(fmt, "×", enc.CodePage, enc.EncodingName))
 End If
にするような感じでしょうか?


その場合、CP50220 において「JIS X 0201 片仮名」については拾えますが(JIS X 0208 片仮名になる)、
元質問にある、13区の『丸文字の数字や、株式会社の略称(株)を1文字にしたものなど』を拾えるわけでは無いので、
今回の目的には合わないかと思います。


> 表示したいところで表示できれば、環境依存でも問題はないでしょうから。
質問の内容が、IME 2007 / 2010 と同等の判定結果という意図であれば NG ですが、
そういう基準で良いのだとしたら、区絵里瑛太さんの使用目的次第ですね。
引用返信 編集キー/
■48714 / inTopicNo.8)  Re[4]: 環境依存文字をチェックしたい
□投稿者/ 中博俊 (1387回)-(2010/04/13(Tue) 00:11:44)
フォントがないけどShiftJISマッピングされている文字などもあります。
これらはUnicode<=>SJIS変換が可能ですが、表示されません。
結局この手の問題はもっと問題を絞り込まないと意味がないんですよ。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -