2024年のうちにやっておきたいこと、ここで宣言しませんか?

Vista+Excel2003の環境です。
Vistaから追加された文字をチェックしたいので、目的の文字をVBAのASC関数を通すことで、アスキーコードの3F、「?」になることまでは調べられました。
例えば「品」の「口」の部分が漢字の「七」になる文字です。
そこで質問なのですが、ASC関数を通すとなぜ3Fになるのか理由が分からないので教えていただけないでしょうか?
自分なりに調べたものの理由が分からず参っています。
問題なく変換出来る文字との違いが説明していただけるとありがたいです。
ちなみにプログラムの目的はVista環境で作ったデータをXPでも使用するのですがその際化けてしまう文字をチェックする為です.

A 回答 (4件)

>遅くなりましたが最終的に理解した内容を記載させていただきます。



かなり違っています。

>・VBAのASC関数はSJISのコードを返す。

間違ってはいませんが、WindowsなのでCP932ですね。
CP932 = Shift_JIS(=SJIS) + Windows独自文字(○囲み数字とか、ローマ数字とか、一部の拡張漢字)

>・ただし対象の文字がSJISであってもCP932の範囲でなければならない。

CP932の方が文字が多いです。

>・CP932の範囲でない場合、ASC関数は3F(「?」)のコードを返す。

これは合ってる。

>・VistaはUnicodeが標準となっている。

CP932とUnicodeが標準というのは、XPもVistaも同じです。

>・追加文字もSJISのコードが振られているが、CP932に含まれていない為、結果的に3Fのコードを返している。

JIS第三水準の文字はShift_JISにもCP932にも含まれていない。
(一部の文字はWindows独自拡張文字としてCP932にある)
Shift_JISにある漢字はJIS第一水準と第二水準だけです。


なお、Shift_JISの空きエリアに第三水準・第四水準の文字などを詰め込んだShift_JIS-2004というのもあるようですが。
    • good
    • 0

既に回答が出ている通り、ANSIに変換できない文字は"?"として


表示されます。こういう文字が含まれているかどうかを調べる
目的ならば、WideCharToMultiByteというAPIが使えます。

Declare Sub RtlMoveMemory Lib "KERNEL32" _
  (ByRef 転送先アドレス As Long, _
   ByVal 転送元アドレス As Long, _
   ByVal バイト数 As Long)
Declare Function WideCharToMultiByte Lib "KERNEL32" _
  (ByVal コードページ As Long, _
   ByVal フラグ As Long, _
   ByVal ワイド文字列 As Long, _
   ByVal ワイド文字列長 As Long, _
   ByVal マルチ文字列 As Long, _
   ByVal マルチ文字列長 As Long, _
   ByVal 変換不能文字 As String, _
   ByRef 変換不能有無 As Long) As Long
Function 検査(ByVal 文字列 As String) As Boolean
Dim アドレス As Long
Dim フラグ As Long
RtlMoveMemory アドレス, VarPtr(文字列), 4
WideCharToMultiByte 0, &H400, アドレス, _
            Len(文字列), 0, 0, "〓", フラグ
検査 = CBool(フラグ)
End Function

関数「検査」は与えられた文字列中にANSI変換不可能な文字を
検出するとTrue、検出しなければFalseを返します。
    • good
    • 0

JISの第三水準の文字ですね。

「?」←出るかな?駄目かも。
面区点番号が、1-14-3。Unicodeだと、U+3402

>ASC関数を通すとなぜ3Fになるのか理由が分からない
ASC関数で?になるのは、CP932(WindowsのシフトJIS)の範囲では存在しないから。
ASCW関数を使うと、Unicode番号に変換できると思います。

>Vista環境で作ったデータをXPでも使用するのですがその際化けてしまう文字
XPでもUnicode文字は使えるので、Unicocdeをサポートしたフォントを使えば化けないと思いますよ。

この回答への補足

ありがとうございます。
日中ネットにつながるPCが無く返信できませんでした。
他の皆さまからもいただいた情報をもとに自分なりに説明を作ったのですが、持ち帰るのを忘れてしまいました。
明日には改めて報告させていただきます。

>ASC関数で?になるのは、CP932(WindowsのシフトJIS)の範囲では存在しないから。
この一文は非常にありがたかったです。
変換できない文字もS-JISのコードが割り振られているので当初はどうしてなのかと思っていました。

>XPでもUnicode文字は使えるので、Unicocdeをサポートしたフォントを使えば化けないと思いますよ。
これで作ったデータを後でOracleに入れるという目的もありましてチェックする必要がありました。

補足日時:2010/03/30 23:19
    • good
    • 0
この回答へのお礼

みなさまありがとうございました。
遅くなりましたが最終的に理解した内容を記載させていただきます。
・VBAのASC関数はSJISのコードを返す。
・ただし対象の文字がSJISであってもCP932の範囲でなければならない。
・CP932の範囲でない場合、ASC関数は3F(「?」)のコードを返す。
・VistaはUnicodeが標準となっている。
・追加文字もSJISのコードが振られているが、CP932に含まれていない為、結果的に3Fのコードを返している。
ということで理解することにしました。
本当にありがとうございました。

お礼日時:2010/04/01 22:19

それは「喜」の異体字で、外字です。

    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報