こんにちは、初めて質問します。
私は現在BASE64(VB)を制作中の者です。半角英数のエンコード・デコードのコーディングは完成したのですが、全角文字となると手も足も出ない状態です。
そこで、これのついて御存知の方、全角文字のエンコード・デコードのコーディング方法を教えて下さい。
サンプルコードも見せていただければ幸いです。
宜しくお願いします。

このQ&Aに関連する最新のQ&A

BASE64 とは」に関するQ&A: base64->rarとは?

A 回答 (2件)

書き方はいろいろあると思いますが、参考までにデコードの例・・・。


※ソースをそのまま貼り付けたら、かなりみづらくなってしまいました。

Sub Main()
Dim pos As Long
Dim Out1 As Long
Dim Out2 As Long
Dim prst As Long
Dim rText As String

rText = "%82%B1%82%EA%82%C5%82%C5%82%AB%82%E9%82%CD%82%B8%82%C5%82%B7%81B"

pos = 1
Do
prst = InStr(pos, rText, "%")
If prst = 0 Then Exit Do
Out1 = Int("&H" & Mid$(rText, prst + 1, 2))
If ((&H81 <= Out1 And Out1 <= &H9F) Or _
(&HE0 <= Out1 And Out1 <= &HEF)) Then
If Mid$(rText, prst + 3, 1) = "%" Then
Out2 = Int("&H" & Mid$(rText, prst + 4, 2))
If &H40 <= Out2 And Out2 <= &HFC Then
rText = Left$(rText, prst - 1) & Chr(Val("&H" & Mid$(rText, prst + 1, 2) & Mid$(rText, prst + 4, 2))) & Right$(rText, Len(rText) - prst - 5)
Else
rText = Left$(rText, prst - 1) & Chr(Val("&H" + (Mid$(rText, prst + 1, 2)))) & Right$(rText, Len(rText) - prst - 2)
End If
pos = prst + 1
Else
Out2 = Asc(Mid$(rText, prst + 3, 1))
If &H40 <= Out2 And Out2 <= &HEF Then
rText = Left$(rText, prst - 1) & Chr(Val("&H" & Mid$(rText, prst + 1, 2) & Hex(Asc(Mid$(rText, prst + 3, 1))))) & Right$(rText, Len(rText) - prst - 3)
Else
rText = Left$(rText, prst - 1) & Chr(Val("&H" + (Mid$(rText, prst + 1, 2)))) & Right$(rText, Len(rText) - prst - 2)
End If
pos = prst + 1
End If
Else
rText = Left$(rText, prst - 1) & Chr(Val("&H" + (Mid$(rText, prst + 1, 2)))) & Right$(rText, Len(rText) - prst - 2)
pos = prst + 1
End If
Loop

Debug.Print rText

End Sub
    • good
    • 0

単に、1byteづつ変換すればいいだけだと思いますが。



BASE64は、単に1byteのバイナリ(0~255)を文字に置き換えているだけですから、半角も全角も関係無いはずです。
    • good
    • 1

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB6.0 Base64のデコード方法を教えてください

VB6.0 でメールソフトを作っているのですが、受信したメールのヘッダで Subject 部分を見ると、

Subject: =?ISO-2022-JP?B?GyRCJCIkJCQmJCgkKhsoQg==?=

と訳の分からないアルファベットになってしまっています。
この Subject を日本語にする方法を教えてください。

一応、Base64のデコードという方法を知りましたが、この処理をVBで実行する場合のコードが分かりません。
工程的には下記の通りかと…

サブジェクトの文字列から「?ISO-2022-JP?B?」の文字列の次のから「?=」までの間の文字列を抽出し、

GyRCJCIkJCQmJCgkKhsoQg== をネタに下記の処理。

1.各文字を2進数表記(6ビット単位)に変換(RFC 2045の Table 1 を使う)。
2.2進文字列(6ビット単位)を8ビット単位でまとめる。
3.8ビット単位の2進数をASCIIコードに変換。
4.シフトJISに変換。

ちなみに、この Subject の答えは あいうえお です。

分かる方、VBコードを教えてください。

VB6.0 でメールソフトを作っているのですが、受信したメールのヘッダで Subject 部分を見ると、

Subject: =?ISO-2022-JP?B?GyRCJCIkJCQmJCgkKhsoQg==?=

と訳の分からないアルファベットになってしまっています。
この Subject を日本語にする方法を教えてください。

一応、Base64のデコードという方法を知りましたが、この処理をVBで実行する場合のコードが分かりません。
工程的には下記の通りかと…

サブジェクトの文字列から「?ISO-2022-JP?B?」の文字列の次のから「?=」までの間の文字列を抽出し...続きを読む

Aベストアンサー

こんばんは。

最近の同じような質問が出ていましたが、もしも、単独で変換エンジンを作るとなると意味が違うかもしれませんね。一応、以下のBasp21 の オブジェクトからBase64 デコードは出来ますが、確か、個別のDLLがあったと思いますから、それが使えれば、それに越したことはありませんね。

例:
Dim myString As String
myString = "Subject: =?ISO-2022-JP?B?GyRCJCIkJCQmJCgkKhsoQg==?="

Dim bobj As Basp21
Dim buf As String
Set bobj = New Basp21

buf = bobj.Base64(myString, 3)

参考URL:http://www.hi-ho.ne.jp/babaq/basp21.html#0039

Qエンコード・デコードの仕方

インターネットのアドレス欄に良く見る
%a4%db%a4%b2%a4%db%a4%b2+%a4%db%a4%cb%a4%e3%a4%e9%a4%e9%a1%c1
って感じのエンコード文字列ですが、
これはナニ形式と呼ぶのでしょうか?

また、この文字列をデコードするにはどうしたらよいのでしょう?

Excelマクロ(VBA)のなかでちょっと使ってみたいので、
どなたか、ご教示の程おねがいします。

Aベストアンサー

(゜▽゜*)♪ニパッ
個人的なロジック公開しちゃう
バグあるかも?

Sub Main()
  MsgBox convUrltoUni("%a4%db%a4%b2%a4%db%a4%b2+%a4%db%a4%cb%a4%e3%a4%e9%a4%e9%a1%c1")
End Sub

Public Function convUrltoUni(inVal As String)
  Dim lngLen   As Long   '文字長
  Dim lngFindPos As Long   '%文字を見つけた位置
  Dim lngStart  As Long   '検索開始位置
  Dim strWk    As String  '文字列連結用ワーク
  Dim blnHigh   As Boolean '文字列が全角か半角によって切り替わるフラグ
  Dim bytWk    As Byte   '「%**」の値
  
  Dim bytHigh   As Byte   '全角文字の時の上位バイト
  Dim bytLow   As Byte   '全角文字の時の下位バイト
  Dim bytChar1  As Byte   '変換ワーク上位
  Dim bytChar2  As Byte   '変換ワーク下位
  
  Dim eucCrLf   As Byte   'EUCの改行コード
  
  'EUC改行コードを取得
  eucCrLf = Asc(vbLf)
  
  '文字長を得る
  lngLen = Len(inVal)
  
  '検索開始位置デフォルト
  lngStart = 1
  
  '上位バイトの処理を行ったことを記すフラグをおろす
  blnHigh = False
  Do
    '%文字を見つける
    lngFindPos = InStr(lngStart, inVal, "%")
    '見つからなかったら、文字長+1をセット
    If lngFindPos = 0 Then
      lngFindPos = lngLen + 1
    End If
    
    '検索開始位置と「%」の発見位置が違うなら、半角文字が存在していることになる
    If lngFindPos <> lngStart Then
      '半角文字なので、そのままセット
      strWk = strWk & Mid(inVal, lngStart, lngFindPos - lngStart)
      blnHigh = False
    End If
    
    '「%」の発見位置が文字長を超えていたら抜ける
    If lngFindPos >= lngLen Then
      Exit Do
    End If
    
    'バイト値としてゲット
    bytWk = CByte("&H" & (Mid(inVal, lngFindPos + 1, 2)))
    
    '先に上位バイトの処理がなされていないなら
    If Not blnHigh Then
      '半角文字の時の処理
      If bytWk < &H80 Then
        '改行コードの処理
        If bytWk = eucCrLf Then
          strWk = strWk & vbCrLf
        '改行コード以外の処理
        Else
          strWk = strWk + Chr(bytWk)
        End If
        
      '半角文字でないときの処理
      Else
        '下位バイトが必要なので、上位バイトとして値を記憶
        bytHigh = bytWk - &H80
        '変換準備上位(ここはお決まり変換ロジック)
        If bytHigh < 95 Then
          bytChar1 = 112
        Else
          bytChar1 = 176
        End If
        
        '上位バイトの処理を行ったことを記すフラグを立てる
        blnHigh = True
      End If
    
    'すでに上位バイトの処理がされている時
    Else
      '上位バイトと組み合わせての変換処理(ここはお決まり変換ロジック)
      bytLow = bytWk - &H80
      If bytHigh Mod 2 = 1 Then
        If bytLow > 95 Then
          bytChar2 = 32
        Else
          bytChar2 = 31
        End If
      Else
        bytChar2 = 126
      End If
      bytHigh = ((bytHigh + 1) \ 2) + bytChar1
      bytLow = bytLow + bytChar2
      
      strWk = strWk & Chr(CInt("&H" & Hex(bytHigh) & Hex(bytLow)))
      
      '上位バイトの処理を行ったことを記すフラグをおろす
      blnHigh = False
    End If
    
    lngStart = lngFindPos + 3
  Loop
  
  convUrltoUni = strWk
End Function

(゜▽゜*)♪ニパッ
個人的なロジック公開しちゃう
バグあるかも?

Sub Main()
  MsgBox convUrltoUni("%a4%db%a4%b2%a4%db%a4%b2+%a4%db%a4%cb%a4%e3%a4%e9%a4%e9%a1%c1")
End Sub

Public Function convUrltoUni(inVal As String)
  Dim lngLen   As Long   '文字長
  Dim lngFindPos As Long   '%文字を見つけた位置
  Dim lngStart  As Long   '検索開始位置
  Dim strWk    As String  '文字列連結用ワーク
  Dim blnHigh   As Boolean '文字列が全角か半角によ...続きを読む

Q全角の英数(0から9、AからZなど)を全て検出したい。

こんにちは。先ほど質問したものです。

EXCELのsheetにセルごとに約300文字、セルの数約150、合計4万5000文字の日本語文章があります。この文章中から全角英数字をすべて検出するプログラミングをお願いしたいのですが、・・

英数字は半角で入力したつもりですが、精査の必要が生じました。簡易言語か、マクロで検出したいのですが、プログラミングをお願いできればと思います。プログラミングは自分でも経験あります。現在多忙なため時間が取れません。また、しばらくプログラミングをしておらず、時間がかかります。どなたか助けていただければ有難いです。よろしくお願いします。
--
回答で「置き換え」を使うことをアドバイスいただきましたが、精査の内容を再確認すると、全角英数のすべてでした。一語づずつ処理してもいいのですが、大変ですし、完璧な処理の要求される内容ですので、できれば、一発で処理できるものが欲しいです。
お助けください。

Aベストアンサー

ありましたね。
http://kokoro.kir.jp/excel/asc.html
Excelの関数でできるようです。

後、もう一つ思いついたのは、一回エクセルからテキスト形式(CSV)に落として、ワードで開きます。そこで、
http://kokoro.kir.jp/word/mojisyu.html
文字種を変換して、CSVを上書き保存。それを、エクセルから開きなおせば、全角->半角の変換ができるはずです。

この二つでダメなら、置き換えをするのが一番確実かつ早いと思います。

QVBで、String型のデータが、全角か、半角かを判断する関数は・・・

こんにちわ。

VB5.0で、String型のデータが、全角か、半角かを判断する関数はあるでしょうか?また、判断方法を教えてください。

よろしくお願いします。

Aベストアンサー

こんにちは。maruru01です。

Asc関数で文字のコードを取得して判断すればいいと思います。
半角はコードが0~255だったと思うので、次のようになります。

文字変数をsとして
If 0 <= Asc(s) And Asc(s) <= 255 Then
  MsgBox "半角です"
Else
  MsgBox "全角です"
End If

ちなみに私の環境はVB6.0なので5.0では試してません。(問題ないと思いますが。)
では。

Q数字の全角文字を調べる

visual basic 2008に関する質問です。

テキストボックスに入力した文字列の中に、数字の全角文字が
含まれているかどうかをチェックするメソッドはありますか?

下記の内容でビルドすると、エラーとなります。

(ソースより抜粋)---------------------------------------
Dim str As String = TextBox1.Text
Dim chr As Char = str.Chars(0)

If ((chr >= &H8250) And (chr <= &H8258)) Then
Label1.Text = "数字は半角文字で入力して下さい。"
End If
-------------------------------------------------------

(エラー内容)-------------------------------------------
演算子'>='は、型'Char'および'Integer'に対して定義されて
いません。
演算子'<='は、型'Char'および'Integer'に対して定義されて
いません。
-------------------------------------------------------

使用OSは、Windows Vistaです。
質問とあわせて、上記のエラーの対処方法について教えて頂けると
助かります。

visual basic 2008に関する質問です。

テキストボックスに入力した文字列の中に、数字の全角文字が
含まれているかどうかをチェックするメソッドはありますか?

下記の内容でビルドすると、エラーとなります。

(ソースより抜粋)---------------------------------------
Dim str As String = TextBox1.Text
Dim chr As Char = str.Chars(0)

If ((chr >= &H8250) And (chr <= &H8258)) Then
Label1.Text = "数字は半角文字で入力して下さい。"
End If
-------------------------------...続きを読む

Aベストアンサー

Class Q4534038

Shared Sub Main()

Dim Str As String = "01239"
For i As Integer = 0 to Str.Length - 1
Dim codepoint As Integer = Char.ConvertToUtf32(str,i)
'Integer同士で比較すればよし。16進リテラルは負になることがあるらしいので,10進リテラルで比較。Unicodeのコードポイントで比較した。
If codepoint >= 65296 AndAlso codepoint <= 65305 Then
System.Console.WriteLine("U+FF10-U+FF19の文字が" & i.toString() & "文字目に使われています。:" & codepoint.ToString())
End If
Next

'説明しないけど正規表現使った方が楽かもね(System.Text.RegularExpressions.RegEx)
'必要ならInteger.ParseやDouble.Parseが使えないか検討しよう。
'個人的には「U+FF10-U+FF19」と「U+0030-U+0039以外」を区別すること自体が嫌い
'もっと嫌いなのはこちらの誤りを一切指摘せず,勝手に誤りを訂正して処理を進めるタイプ

System.Console.ReadKey(true)
End Sub

End Class

Class Q4534038

Shared Sub Main()

Dim Str As String = "01239"
For i As Integer = 0 to Str.Length - 1
Dim codepoint As Integer = Char.ConvertToUtf32(str,i)
'Integer同士で比較すればよし。16進リテラルは負になることがあるらしいので,10進リテラルで比較。Unicodeのコードポイントで比較した。
If codepoint >= 65296 AndAlso codepoint <= 65305 Then
System.Console.WriteLine("U+FF10-U+FF19の文字が" & i.toString() & "文字目に使われています。:" & codepoint.ToString())
End ...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報