
Windows XPでVB.NET2010で文字コード変換のプログラムを下記のように作成しました。
Dim beforeStr As String = "変換前"
Dim utfEnc = System.Text.Encoding.GetEncoding(65001)
Dim sjisEnc = System.Text.Encoding.GetEncoding(932)
Dim beforeBytes() As Byte = utfEnc.GetBytes(beforeStr)
Dim afterBytes() As Byte = System.Text.Encoding.Convert(sjisEnc, utfEnc, beforeBytes)
Dim afterStr As String = sjisEnc.GetString(afterBytes)
TextBox3.Text = afterStr
Dim reverseStr As String = afterStr
Dim reverseBytes() As Byte = sjisEnc.GetBytes(reverseStr)
Dim baseBytes() As Byte = System.Text.Encoding.Convert(utfEnc, sjisEnc, reverseBytes)
TextBox4.Text = utfEnc.GetString(baseBytes)
SJIS->UTF8に変換して、確認のためにUTF8->SJISに逆変換してみましたが、
「変換」までは正しいのですが、最後の「前」が文字化けしてしまします。
正しくSJIS-.UTF8->SJISするには、どのように修正すればよろしいでしょうか?
よろしくお願いします。

A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
> 「UTF8の文字列」は取り扱えないこともわかりました。
うーん,下の引用文からはわかっていないように思えますが……。
> 勉強不足ですいません、SJISの文字列をUTF8文字列でファイル等に書き出すのならば、可能なのでしょうか?
まず、根本。
「文字列はEncodingを持っていない」
これを理解して下さい。
Shift_JISだのUTF-8だのUTF-16だのというのは,「文字列とバイト列を変換するための規則」でしかありません。
Shift_JISのバイト列は存在しても,Shift_JISの文字列というものは,少なくとも.NET Frameworkの世界には存在しません。
・特定のEncodingでの表現を保持したい場合はbyteの配列を使う
・Encodingが重要ではなく,文字列として扱いたい場合はstringを使う
・特定のEncodingでの表現と文字列の間の変換はEncodingクラスのGetBytesおよびGetStringメソッドを使う
・2つのEncoding間の表現の変換にはEncoding.Convertメソッドを使う
・ファイル等のStreamに関しては,StreamReaderやStreamWriterをラッパーとして使うことでStreamのEncodingでの表現と文字列の変換が可能
ちなみに,Shift_JISのファイルを読み込んでUTF-8のファイルとして出力する場合には,
using (var reader = new StreamReader("input.txt", Encoding.GetEncoding("Shift_JIS")))
using (var writer = new StreamWriter("output.txt", Encoding.UTF8))
{
writer.Write(reader.ReadToEnd());
}
のように書けます。
No.3
- 回答日時:
こんにちは。
すいません、こちらでは。。。
Dim beforeStr As String = "変換前"
'こちらの部分は、もっと簡単な表現があるかもしれません。------
If (beforeStr.Length Mod 2) <> 0 Then
beforeStr = beforeStr & " " '文字数が奇数の時は空白文字を付けたす
End If
'----------------------------------
Dim utfEnc = System.Text.Encoding.UTF8
Dim sjisEnc = System.Text.Encoding.GetEncoding(932)
Dim afterBytes() As Byte = sjisEnc.GetBytes(beforeStr)
Dim afterStr As String = sjisEnc.GetString(afterBytes)
Dim reverseBytes() As Byte = utfEnc.GetBytes(afterStr)
TextBox3.Text = sjisEnc.GetString(reverseBytes)
reverseBytes = sjisEnc.GetBytes(TextBox1.Text)
TextBox4.Text = utfEnc.GetString(reverseBytes)
参考URL:http://oshiete.goo.ne.jp/qa/5909905.html
angel_Z 様
ありがとうございました。
できました。
ただし下から2行目
reverseBytes = sjisEnc.GetBytes(TextBox1.Text)
は必要ないです。
要するに、偶数にしておかなければならないということなのですね。
奇数の場合は、空白がUTF8->SJISの場合、残っているようですので、
空白削除すれば、うまくいきそうです。
これで5歩前進しました。
No.2
- 回答日時:
Encoding.Convertの第一引数と第二引数が逆ではありませんか。
第1引数は第3引数のエンコーディングを指定します。
http://msdn.microsoft.com/ja-jp/library/kdcak6ye …
つまり,
> Dim afterBytes() As Byte = System.Text.Encoding.Convert(sjisEnc, utfEnc, beforeBytes)
は,
Dim afterBytes = Encoding.Convert(utfEnc, sjisEnc, beforeBytes)
です。beforeBytesはutfEnc.GetBytesで取得したデータですから。
また,Stringの内部表現は常に「UTF-16」です。
StringはEncoding情報を「持っていません」。
なので,「UTF8の文字列」という物を.NET FrameworkのStringは「取り扱えません」。
Yune-Kichi 様
ありがとうございました、引数確認していませんでした。
「UTF8の文字列」は取り扱えないこともわかりました。
勉強不足ですいません、SJISの文字列をUTF8文字列でファイル等に書き出すのならば、可能なのでしょうか?
No.1
- 回答日時:
こんにちは。
これではどうでしょうか?
Dim beforeStr As String = "変換前"
Dim utfEnc = System.Text.Encoding.UTF8
Dim sjisEnc = System.Text.Encoding.GetEncoding(932)
Dim afterBytes() As Byte = sjisEnc.GetBytes(beforeStr)
Dim afterStr As String = sjisEnc.GetString(afterBytes)
Dim reverseBytes() As Byte = utfEnc.GetBytes(afterStr)
TextBox4.Text = utfEnc.GetString(reverseBytes)
'ためしに反対も
reverseBytes = sjisEnc.GetBytes(TextBox4.Text)
MsgBox (sjisEnc.GetString(reverseBytes))
angel_Z 様
ありがとうございました。
できました。
サンプルの
TextBox4.Text=utfEnc.GetString(reverseBytes)の部分がUTF8の文字列と考えて良いのでしょうか?
また、TextBox4.Textは「変換前」とフォーム上に表示されますが、UTF8に変換してもなぜに表示されるのでしょうか?
なんだか、納得できないんですよね。
すいません、変な質問で。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Excel(エクセル) このコードに追記事項の仕方を教えて下さい。 以下のコード内容に出てくる。セルH3が空白の場合、エラー 4 2023/08/03 00:22
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Excel(エクセル) エクセルVBA、間違っているコード内容を正して頂けませんか? エクセルワークシートに納品書を作ったの 2 2023/08/02 21:13
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SJIS->UTF8->SJISコード変換に...
-
文字コードの%E3%80%とは何です...
-
SQLのデータで半角カナを全角に...
-
MySQL&PHPで日本語検索
-
Visual Studio プロパティペー...
-
エンコードとコンバートの違い...
-
漢数字の変換
-
Excel VBAでPDFファイルをMicro...
-
シングルクォーテーションの変換
-
ローマ字からカナに変換する方...
-
エクセルでの漢字(全角ひらが...
-
これはなんの文字コードでしょうか
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
substrでutf8の日本語文字を先...
-
VBA 文字に半角が含まれて...
-
メモ帳の段落の揃え方
-
Excelについて質問です。 セル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでPDFファイルをMicro...
-
CString から LPCTSTRの型に変換
-
文字コードの%E3%80%とは何です...
-
CString型からdouble型への変換
-
SQLのデータで半角カナを全角に...
-
ローマ字からカナに変換する方...
-
Delphiの型変換
-
VBScript 全角英数記号→半角英...
-
SJIS->UTF8->SJISコード変換に...
-
テキストをhtml変換するには
-
漢数字の変換
-
Encode.pmで「髙」(ハシゴ高)...
-
VBScript文字列をSJISからUTF8...
-
vbwide(半角⇒全角変換)について
-
文字列を quoted-printable 文...
-
エクセルでの漢字(全角ひらが...
-
oracle10g eucのblobをsjisのch...
-
漢字からカタカナ変換マクロ
-
VB6にも「ToString」ってあり...
-
goo blogでyou tube を埋め込む...
おすすめ情報