
Vista+Excel2003の環境です。
Vistaから追加された文字をチェックしたいので、目的の文字をVBAのASC関数を通すことで、アスキーコードの3F、「?」になることまでは調べられました。
例えば「品」の「口」の部分が漢字の「七」になる文字です。
そこで質問なのですが、ASC関数を通すとなぜ3Fになるのか理由が分からないので教えていただけないでしょうか?
自分なりに調べたものの理由が分からず参っています。
問題なく変換出来る文字との違いが説明していただけるとありがたいです。
ちなみにプログラムの目的はVista環境で作ったデータをXPでも使用するのですがその際化けてしまう文字をチェックする為です.
No.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というのもあるようですが。
No.3
- 回答日時:
既に回答が出ている通り、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を返します。
No.2
- 回答日時:
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に入れるという目的もありましてチェックする必要がありました。
みなさまありがとうございました。
遅くなりましたが最終的に理解した内容を記載させていただきます。
・VBAのASC関数はSJISのコードを返す。
・ただし対象の文字がSJISであってもCP932の範囲でなければならない。
・CP932の範囲でない場合、ASC関数は3F(「?」)のコードを返す。
・VistaはUnicodeが標準となっている。
・追加文字もSJISのコードが振られているが、CP932に含まれていない為、結果的に3Fのコードを返している。
ということで理解することにしました。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetws関数で読み込んだUNICODE...
-
携帯電話の絵文字対応の掲示板...
-
VBAのコマンドボタンの文字列の...
-
C++で空Enterの入力を判...
-
文字の入力で横バー上段、中断...
-
VBAでCSVをExcelに取り込む時に...
-
文字化け変換方法
-
jsp 改行コードで改行させて表...
-
エディットボックスで改行
-
メッセージボックスで1025文字...
-
Excel関数「COUNTIF」で”文字”...
-
コンボボックスの項目中に改行を
-
エクセルのCOUNTIFが正しくカウ...
-
vbsで2文字以上の空白を改行に...
-
記号は半角と全角どちらがよい...
-
ソースコードの1行が長いとき...
-
C言語の標準入力で改行しない方法
-
改行について
-
【VBA】エクセルで最後の不要な...
-
vb.netでのリッチテキストボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
カンマの含まれる文字列の数値...
-
VB6.0 Base64のデコード方法を...
-
ホームページ作成の初心者です
-
VB6 機種依存文字の変換
-
fgetws関数で読み込んだUNICODE...
-
携帯サイトで販売されている絵...
-
大小文字混合させて削除したい
-
i-mode、ez-web、ボーダフォン...
-
数値をASCII文字にする方法につ...
-
1バイト文字の上位4ビット・...
-
エディットコントロールへのUni...
-
VBA ASC関数で変換できない文...
-
マクロで半角を全角に
-
文字列と文字
-
ヌル文字とは一体何でしょうか
-
携帯電話の絵文字対応の掲示板...
-
16進数の文字列をアスキーコー...
-
機種依存文字
-
PHPでMysqlに絵文字を入力する...
-
format関数についてです。
おすすめ情報