2016年06月29日
VB6で文字列を切り出したら文字化けした話(マルチバイト対応)
目次
・VB6で文字列を切り取ったら文字化けした
・変更前ソース(VB6)
・対処策(VB6)
・変更後ソース(VB6)
・他言語の場合(.NET系、Ruby、PHP)
・所感
・VB6で文字列を切り取ったら文字化けした
文字列処理に立ちはだかる壁"マルチバイト"
そんな壁にぶち当たり、対処した記録としてこの記事を残します。
ちなみに言語はVB6です。(大人の事情)
ネット上ではいろんな言語で同様の対処策に対する情報共有がされておりますが、
2016年に「VB6 マルチバイト 文字列 切り出し」とググっても、
VB.NETの記事ばかり出てくる有様なので、
この記事にも価値はあるかも。。。
・変更前のソース(VB6)
・対処策(VB6)
上記のコードだと文字をまたがって切り取る場合は文字化けします。
そこで対処策を調べると
@対象文字列の格納変数をVariant型にすればOK
A1文字づつバイト判定し、指定バイト数を超える場合は省く
以上の2パターンの方法で対応することが分かりました。
まずは簡単な@のパターンを試してみました。。。が、NG。
そこでAのパターンで対処しました。
・変更後のソース(VB6)
・他言語の場合
・.NET系(VB.NET、C#.NET)
調べた限りVB6同様の処理が必要
・Ruby
1.9以降ではマルチバイトを考慮した作りになっているので1行で完結(変数宣言除く)
・PHP
こちらもRubyと同じく1行でできる。
ただし、文字コードを指定してあげる必要性がある。
・所感
やっぱ流行りの言語は気が利いているなというのが率直な感想。
ただ、ライブラリやフレームワークは自信でコーディング出来るレベルの人が、
効率化を図るためのツールであるという意見に同意のため、
今回の"壁"にぶち当たったことにも意義はあると思います。
そしていろんな言語での実装パターンを考察するのがとても面白い!
・VB6で文字列を切り取ったら文字化けした
・変更前ソース(VB6)
・対処策(VB6)
・変更後ソース(VB6)
・他言語の場合(.NET系、Ruby、PHP)
・所感
・VB6で文字列を切り取ったら文字化けした
文字列処理に立ちはだかる壁"マルチバイト"
そんな壁にぶち当たり、対処した記録としてこの記事を残します。
ちなみに言語はVB6です。(大人の事情)
ネット上ではいろんな言語で同様の対処策に対する情報共有がされておりますが、
2016年に「VB6 マルチバイト 文字列 切り出し」とググっても、
VB.NETの記事ばかり出てくる有様なので、
この記事にも価値はあるかも。。。
・変更前のソース(VB6)
Dim strData As String: strData = "ハンカク全角" ''対象文字列
Dim intDataLength As Integer: intDataLength = Len(strData) ''対象文字列のバイト長
Dim intByte As Integer: intByte = 3 ''指定バイト数
Dim strSliceData As String ''切り出し文字列格納用
strSliceData = strConv(MidB(strConv(strData,vbFromUnicode),1,intByte),vbUnicode)
Call MsgBox(strSliceData)
・対処策(VB6)
上記のコードだと文字をまたがって切り取る場合は文字化けします。
そこで対処策を調べると
@対象文字列の格納変数をVariant型にすればOK
A1文字づつバイト判定し、指定バイト数を超える場合は省く
以上の2パターンの方法で対応することが分かりました。
まずは簡単な@のパターンを試してみました。。。が、NG。
そこでAのパターンで対処しました。
・変更後のソース(VB6)
Dim strData As String: strData = "ハンカク全角" ''対象文字列
Dim intDataLength As Integer: intDataLength = Len(strData) ''対象文字列のバイト長
Dim intByte As Integer: intSliceSize = 3 ''指定バイト数
Dim strSliceData As String ''切り出し文字列格納用
Dim strChar As String ''切り出し文字格納用
Dim intLoopCount As Integer ''ループ変数
For intLoopCount = 1 To intDataLength
''全角半角問わず、1文字切り出し
strChar = Mid(strData, intLoopCount, 1)
''前回までに切り出した文字列と今回の文字を足したものが指定バイト数を超えていないか確認
If (LenB(StrConv(strSliceData & strChar, vbFromUnicode)) <= intByte Then
strSliceData = strSliceData & strChar
Else
Exit For
End If
Next
Call Msgbox(strSliceData)
・他言語の場合
・.NET系(VB.NET、C#.NET)
調べた限りVB6同様の処理が必要
・Ruby
data = "ハンカク全角" #対象文字列
sliceSize = 3 #対象文字列のバイト長
echo data.slice(sliceSize)
1.9以降ではマルチバイトを考慮した作りになっているので1行で完結(変数宣言除く)
・PHP
$str = 'ハンカク全角';
$byte = 3;
echo = mb_strcut($str,0,$byte,'SJIS');
こちらもRubyと同じく1行でできる。
ただし、文字コードを指定してあげる必要性がある。
・所感
やっぱ流行りの言語は気が利いているなというのが率直な感想。
ただ、ライブラリやフレームワークは自信でコーディング出来るレベルの人が、
効率化を図るためのツールであるという意見に同意のため、
今回の"壁"にぶち当たったことにも意義はあると思います。
そしていろんな言語での実装パターンを考察するのがとても面白い!
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/5204357
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック