[[20061002073914]] 『JISコード以外の字を使わない方法は』(IVIO) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『JISコード以外の字を使わない方法は』(IVIO)

質問内容・・・名前を打つのにWindowsでは \x{fffd}焉@\x{fffd}普@とか、JISコード以外の字を打てますが、JISコードにない字は●で打つことになりました。
 確実にユニコードなどの字を見つける方法はありますか?
 よろしくお願いします。

[エクセルのバージョン]
Excel2003,

[OSのバージョン]
WindowsXP


 \x{fffd}烽ヘ JISコードにあるのでは?第三水準だったかな?
 JIS 0x967e
 ShiftJIS 0xfbfc
 第一水準だけにする、ということかな?

早速にありがとうございます。

ShiftJIS 0xfbfc

 第一水準だけにする、ということかな?
って
どう使えばいいのでしょうか?
スミマセン理解力がなくって…m(__)m


 横から失礼します。
 [IVIO]さんは、「\x{fffd}焉vや「\x{fffd}普vは「JISコード以外の字」と書いていますが、
 「\x{fffd}焉vはJISコード=967E (シフトJISコード=FBFC) ユニコード=9AD9 ですし、
 「\x{fffd}普vはJISコード=9433 (シフトJISコード=FAB1) ユニコード=FA11 です。
 どちらもJISで定義されている文字ですし、ユニコードでも定義されている文字です。
 どういう文字を見つけたいのでしょう?
 ※お二方とも、コメントの下にはハンドルネームを忘れずに書きましょう。
 (ちゅうねん)

(ちゅうねん)様、説明が足りずに申し訳ありませんでした。

名簿を作るのにMACを使うそうなので第一水準だけ使ってねと言われました。
それ以外の字は外字を使って入れるとのことです。
第一水準以外の文字は=のような記号に化けるらしいので発見がわかりにくく
見落とすこともあるらしいので黒丸で入れたいのです。
よろしくお願いします。

(IVIO)

追伸…私が入力すると文が改行されずに表示されるのはどうしてでしょうか?
改行をしているつもりなのですが…。
見にくくて申し訳ありません。


 追伸について下記を参考に・・・
https://www.excel.studio-kazu.jp/wiki/excelboard/#text_format

https://www.excel.studio-kazu.jp/cgi-bin/kazuwiki2.cgi?mycmd=read&mypage=[[20060919142132]]

 (mack)

 自分の勉強のために考えてみました。漢字のコードは

http://www.infonet.co.jp/ueyama/ip/binary/x0208txt.html

 の表を見て、 JISコードの第2水準は "弌" 以降だろうと思いました。
 ASC("弌")=-26465 なので、ASC関数で -26465 より小さい値が第1水準と判断して、
 次のユーザー定義関数を考えました。

 Function Kanji2toMaru(s As String)
    '第1水準以外の文字を●に置きかえる
    Dim L As Integer
    Dim i As Integer
    Dim ss As String

    L = Len(s)
    ss = ""
    For i = 1 To L
        If Len(Mid(s, i, 1)) = LenB(StrConv(Mid(s, i, 1), vbFromUnicode)) Then
            ss = ss & Mid(s, i, 1)
        ElseIf Asc(Mid(s, i, 1)) < -26465 Then
            ss = ss & Mid(s, i, 1)
        Else
            ss = ss & "●"
        End If
    Next i
    Kanji2toMaru = ss
 End Function

 このコードを標準モジュールに貼り付けてから、 A1 に "\x{fffd}煖エ" といれて、
 B1 に =Kanji2toMaru(A1) とすると、B1 に "●橋" となりました。

 全然自信がありません。どなたか達者な方の指摘をお願いしたいと思います。

 ※半角文字対応に変更しました。
 ※調べると、Windowsのエクセルではユニコードが使われているようで、
  何とも自身がありません。

 (ホグペン)


  (mack)様、入力方法をありがとうございました。

 (ホグペン)様、大変な作業をありがとうございました。

 ですが、理解力のない私ですので、実際の関数の張り方が、
 やってみてもセルの中で文字として認識されるような作業しかできませんでした。
 スミマセンがもう少し手順の説明を補足していただければ、
 助かるのですがよろしくお願い致します。

 メニューから ツール>マクロ>BisualBasicEditor を選びます。
 新しい画面(タイトルが MicrosoftVisualBasic となっている)が出ますので、その左側に

  VBAProject(ファイル名)

 とあるのを確認してください。ファイル名のところは実際のファイル名が入っています。
 ここが選択状態になっているのを確認し、この画面の上のメニューの 挿入 から
 「標準モジュール」をクリックします。右側の空白部分に、上に書きましたコードの

 Function Kanji2toMaru(s As String) 
  から
 End Function

 をコピーしてきて、貼り付けます。

 この後、エクセルの普通の画面に戻って、A1 にデータがあるとして、例えば B1 に

 =Kanji2toMaru(A1) 

 を普通の関数のように入れてみてください。

 A1 が "高橋" なら、B1 の値も "高橋" になり、 "\x{fffd}煖エ" なら "●橋" となります。

 ※入力時点で●に変換するのではなく、いったん入力されているデータを別の場所に
  変換します。

 ※はじめの発言にも書きましたように、エクセルの中ではユニコードが使われているようで、
  わたしの書いたコードが正しく第1水準以外のものを●に変えているのかどうかについては、
  自信がありません。
 (ホグペン)


 (ホグペン)様、できました。ありがとうございます。

 実行していくと●に変更していく箇所がおおかったので指示を聞き直すと
 第二水準も使っていいのを勘違いしていました。スミマセン…m(__)m

 ASC関数で -26465 より小さい値が第1水準と判断の数字を

 第二水準も使える数字を教えていただけませんか?
 よろしくお願いいたします。
 (IVIO)

 >ASC関数で -26465 より小さい値が第1水準と判断の数字を
 >
 > 第二水準も使える数字を教えていただけませんか?

 すみません、ちょっと考えてみているのですが、実はよくわかりません。
 文字を順番に調べていって、第○水準なら●に置き換える、という基本的な考え方は、すでに
 お示ししたコードでいいと思います。

 が、文字コードを見てその文字が第○水準に属するかどうかの判定がよくわかりません。

http://www.infonet.co.jp/ueyama/ip/binary/x0208txt.html

 にあげてあるものが第2水準までだと思うので("\x{fffd}\x{fffd}"がない)、このコードかどうかで判定すれば
 いいのですが、 VBAでどうすればいいのかわかりません。

 エクセルで =CODE() で表示させるコード(上記WEBサイトのものと同じ)と、
 VBA で =ASC() および =ASCW() で表示させるコードがすべて異なります。

 "亜" (第1水準)  がそれぞれ 12321 -30561  20124
 "熙" (第2水準?)がそれぞれ 29734  -5468  29081
 "\x{fffd}\x{fffd}" (第3水準?)がそれぞれ 38526  -1028 -25895

 などとなります。なんとなく ASCW("\x{fffd}\x{fffd}") が負なので、これで判定したものが次のコードです。

 Function Kanji2toMaru(s As String)
    '第1・2水準以外の文字を●に置きかえる
    Dim L As Integer
    Dim i As Integer
    Dim ss As String

    L = Len(s)
    ss = ""
    For i = 1 To L
        If Len(Mid(s, i, 1)) = LenB(StrConv(Mid(s, i, 1), vbFromUnicode)) Then
            ss = ss & Mid(s, i, 1)
        ElseIf AscW(Mid(s, i, 1)) > 0 Then
            ss = ss & Mid(s, i, 1)
        Else
            ss = ss & "●"
        End If
    Next i
    Kanji2toMaru = ss
 End Function

 とりあえず "\x{fffd}\x{fffd}" や "\x{fffd}\x{fffd}" は判定できているようですが、本当にこれですべての第1・2水準以外を
 判定できているのかは、わかりません。 m(_ _)m

 (ホグペン)


 (ホグペン)様、ありがとうございます。

 今すぐに検証は出来ませんが第1・2の文字を入れて確かめてみたいと
 思います。本当にありがとうございました。
 (IVIO)


 余計なことでしょうが
 "亜"のJISコード=3021、シフトJISコード=889F、ユニコード=4E9C
 "熙"のJISコード=7426、シフトJISコード=EAA4、ユニコード=7199
 "\x{fffd}\x{fffd}"のJISコード=967E、シフトJISコード=FBFC、ユニコード=9AD9
 です。(全て16進数)
 例えば、16進数の889Fは10進数にすると34,975ですが、整数型(Integer)だと
 -32,768〜32,767までしか扱えないために、負数として表現されてしまうものです。
 長整数型(Long)だとそのままの値で扱えると思います。

http://ja.wikipedia.org/wiki/JIS_X_0208

 によると、第1水準はJISコード3021〜4F53、第2水準はJISコード5021〜7426 らしいです。
  第3水準・第4水準漢字なんてのもあるようで、けっこう手強いです。
 (ちゅうねん)

 (ちゅうねん)様、ありがとうございます。

 手強いとのこと、手が震えます。
 http://ja.wikipedia.org/wiki/JIS_X_0208  を見ましたが

 ?ん ん〜ん!?って感じですが、どこかでJISコード一覧表を見つけて
 全文字どれぐらいあるのか確かめてみます。
 でもワケが分かるか…?

 (IVIO)


 > 例えば、16進数の889Fは10進数にすると34,975ですが、整数型(Integer)だと
 >  -32,768〜32,767までしか扱えないために、負数として表現されてしまうものです。

 あ、そういうことだったのですか。生兵法でやってはいけませんね。

 ワークシートの =CODE() でJISコード、 VBA の =ASC() で シフトJISコード、
 VBA の =ASCW() でユニコードが出るようです。(Windows2000,Excel2002 での場合)
 ( VBA で JISコードを求める関数はないのでしょうか?)

 で、"熙" が第2水準の最後のようなので、
 これよりコード番号が小さい文字は 1・2水準に属すると判断してよいのなら、
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 Function Kanji2toMaru(s As String)
    '第1・2水準以外の文字を●に置きかえる
    Dim L As Integer
    Dim i As Integer
    Dim ss As String

    L = Len(s)
    ss = ""
    For i = 1 To L
        If Len(Mid(s, i, 1)) = LenB(StrConv(Mid(s, i, 1), vbFromUnicode)) Then
            ss = ss & Mid(s, i, 1)
        ElseIf Hex(Asc(Mid(s, i, 1))) <= Hex(Asc("熙")) Then
            ss = ss & Mid(s, i, 1)
        Else
            ss = ss & "●"
        End If
    Next i
    Kanji2toMaru = ss
 End Function

 となりますが……

 う〜ん、相変わらず自信なし。どなたかにフォローしてほしいところです。
 (ホグペン)


(ホグペン)様、ありがとうございます。

 で、"熙" が第2水準の最後のようなので、
 これよりコード番号が小さい文字は 1・2水準に属すると判断してよいのなら、

 上記関数で一度やってみます。本当に申し訳なくって、でも本当にありがたくって
 嬉しい状況です。
(IVIO)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.