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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
2024年は「名探偵コナン30周年」「涼宮ハルヒ20周年」などを迎えますが、 あなたが「もうそんなに!?」と驚いた○○周年を教えてください。
-
「これはヤバかったな」という遅刻エピソード
寝坊だったり、不測の事態だったり、いずれにしても遅刻の思い出はいつ思い出しても冷や汗をかいてしまいますよね。
-
ちょっと先の未来クイズ第4問
11月ごろに発表される、2024年の「新語・流行語大賞」にノミネートされる言葉を書けるだけ書いてください。
-
高校三年生の合唱祭で何を歌いましたか?
大人になると大人数で合唱する機会ってないですよね。 思い出すと、高校三年生の合唱祭が最後でした。 そこで、みんなの思い出の合唱曲を知りたい!
-
UTF-8からShift-JISへの文字コード変換について
Windows Vista・XP
-
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
VB6からVB2010への変換について
Visual Basic(VBA)
-
-
4
VBScript文字列をSJISからUTF8へ関数
Visual Basic(VBA)
-
5
VBA 変数名に変数を使用したい。
Visual Basic(VBA)
-
6
win10のbasp21がエラーになる
フリーソフト
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字コードの%E3%80%とは何です...
-
CString から LPCTSTRの型に変換
-
ローマ字からカナに変換する方...
-
文字列が勝手にエスケープ文字...
-
URLが日本語なのになぜ表示...
-
CSVファイルの中で、「 , 」カ...
-
住宅にカナを入力する際に丁目...
-
Perl(cgi)からPerl(cgi)への引数
-
word差し込み印刷 半角カタカ...
-
全角英数字の必要性が理解できない
-
チェックボックスの複数選択の...
-
Word2007の全角文字、全角スペ...
-
英数字のみ全角から半角に変換
-
カンマ区切りの数字をCSVフ...
-
任意の区切り文字でsplitする方法
-
EXCELからCSVにすると余計なカ...
-
差し込み印刷について教えてく...
-
VB2005のTextBoxでカン...
-
いまスマホからカードの申込み...
-
VC++のエディトボックスについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでPDFファイルをMicro...
-
CString から LPCTSTRの型に変換
-
文字コードの%E3%80%とは何です...
-
SQLのデータで半角カナを全角に...
-
SJIS->UTF8->SJISコード変換に...
-
Delphiの型変換
-
テキストをhtml変換するには
-
算用数字(半角)から漢数字へ...
-
エクセルでの漢字(全角ひらが...
-
VBScript文字列をSJISからUTF8...
-
VB6にも「ToString」ってあり...
-
Kシェルでの文字型→数値型変換
-
ウイザードからのVBAでクエリー...
-
Visual Studio プロパティペー...
-
ローマ字からカナに変換する方...
-
カタカナと英字の相互変換
-
VBScript 全角英数記号→半角英...
-
漢数字の変換
-
五十音の並べ替えsortを教えて...
-
r18文学賞は文字数ではなく、枚...
おすすめ情報