• 締切済み

SJIS->UTF8->SJISコード変換について

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するには、どのように修正すればよろしいでしょうか? よろしくお願いします。

みんなの回答

回答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()); } のように書けます。

  • angel_Z
  • ベストアンサー率66% (12/18)
回答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://okwave.jp/qa/q5909905.html
godo-tys
質問者

お礼

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(v=vs.100).aspx つまり, > 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は「取り扱えません」。

godo-tys
質問者

お礼

Yune-Kichi 様 ありがとうございました、引数確認していませんでした。 「UTF8の文字列」は取り扱えないこともわかりました。 勉強不足ですいません、SJISの文字列をUTF8文字列でファイル等に書き出すのならば、可能なのでしょうか?

  • angel_Z
  • ベストアンサー率66% (12/18)
回答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))

godo-tys
質問者

お礼

angel_Z 様 ありがとうございました。 できました。 サンプルの TextBox4.Text=utfEnc.GetString(reverseBytes)の部分がUTF8の文字列と考えて良いのでしょうか? また、TextBox4.Textは「変換前」とフォーム上に表示されますが、UTF8に変換してもなぜに表示されるのでしょうか? なんだか、納得できないんですよね。 すいません、変な質問で。

関連するQ&A

  • ASP.NET SJIS→UTF-8文字コード変換。

    ASP.NETをVBで開発しています。 無償の ASP.NET ホスティング 「WebMatrixHosting Japan」で実行しています。 表題の件ですが、シフトJISのHTMLページから UTF-8のASPXページへPOSTした時に、文字化けすることで困っています。 シフトJISの値をUTF-8に変換できる方法をご存知の方、教えてください。お願いします。 ASCII文字は問題なく実行できます。 以下検証中のコードです ファイル名:SJIS.htm <form action="UTF-8.aspx"> <input type="text" name="username"> <input type="submit"> </form> ファイル名:UTF-8.aspx Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load IF request.form("username") <> "" THEN DIM strIn AS String = request.form("username") Dim bytesData As Byte() = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(strIn) Dim outPut As String = System.Text.Encoding.GetEncoding("UTF-8").GetString(bytesData) Literal1.Text = outPut END IF End Sub

  • C# 文字コード変換

    お世話になります。 宜しくお願いします。 C#でプログラムを開発しております。 その中で、文字列をShift-JISでテキストファイルへ書き出す という処理があるんですが 以下のように指定しても文字コードがUTF-8で書き出されているようです。 コードを調べましたが間違いが見つけられません。 どこか間違いはございますでしょうか。 ご教授宜しくお願いします。 ・文字コードを判別する場所 : http://encode-detector.uic.jp/tool ・テキストの形式 :ファイル名.DMD /////////////// 以下コード /////////////////////////     String param = "テキストへ書き込む内容";     System.IO.StreamWriter sw =          new System.IO.StreamWriter(             @"C:\hoge.DMD",              false,             System.Text.Encoding.GetEncoding("Shift_JIS") );     System.Text.Encoding src = System.Text.Encoding.UTF8;     System.Text.Encoding dest = System.Text.Encoding.GetEncoding("Shift_JIS");     byte[] temp = src.GetBytes(param);     byte[] sjis_temp = System.Text.Encoding.Convert(src, dest, temp);     param = dest.GetString(sjis_temp);     sw.Write(param);     sw.Close();

  • SJIS→UTF-8変換後の文字化けについて

    EXCELで作ったテキストデータ(SJIS)をPHPで読み込んでUTF-8でDBへ書き込むという処理をしたいのですが、一部どうしても文字化けしてしまう文字("l(リットル)"と"II")があり困っています。 具体的には、data.dat(SJIS)を、 hoge.php(UTF-8)で、 $data = mb_convert_encoding(file_get_contents("data.dat"),"UTF-8","auto"); というようにしています。 テキストデータはSJIS、DBへはUTF-8というのは変えられません。 なにかよい方法はないでしょうか?

    • ベストアンサー
    • PHP
  • 「C#」文字コードの取得&文字変換

    C#で文字コードを調べるプログラムを作成しています。 そこで2つ質問をさせてください。 1つ目(文字コード調べ) TextBoxに漢字を入力して,各エンコーディングの文字コードを調べるときに,UNICDEの場合, Encoding enc_default = Encoding.GetEncoding(932); string input = tb_input.Text; byte[] byte_input = enc_default.GetBytes(input); string outtext_unicode = ""; Encoding enc_unicode = Encoding.Unicode; byte[] byte_unicode = Encoding.Convert(enc_default,enc_unicode, byte_input); foreach (byte b in byte_unicode) { outtext_unicode += string.Format("{0:X}", (int)b); } tb_output_unicode.Text = outtext_unicode; とすると,調べたい文字コードがLE(リトルエディアン)で出力されます。これをBE(ビッグエディアン)で出力されるにはどうしたらよいでしょうか? ご存知の方がいらっしゃいましたら,ぜひ教えてください。 よろしくお願いいたします。 2つ目(文字コードから文字を取得する) 上記の質問と逆のパターンで,TextBoxに文字コードを入力してもらい,人間が読める文字に変換する場合下記のようなコードを書くと, string codePoint_string = tb_output_unicode.Text; int codePoint = int.Parse(codePoint_string); char c = (char)codePoint; tb_input.Text = Convert.ToString(c); ASCIIの文字コードを入力した場合には,きちんと変換してくれるのですが,漢字の文字コードを入力すると,FormatExceptionが発生します。 何か勘違いをしているのかもしれませんが,いまいちやり方が創造できません。 こちらも,ご存知の方がいらっしゃいましたら,ご教示願います。

  • PHP mb_convert_encoding sjisからutf-8

    PHP mb_convert_encoding sjisからutf-8で一部文字の文字化けが発生します。 設定ファイル(sjisで作成)をPHP(utf-8)で読み込み、内容を更新して、再度設定ファイルとして書き出す(上書きする)スクリプトを書いています。utf-8で書き出す分には、全く問題がないのですが、書き出す前にmb_convert_encodingでutf-8からsjisに変換すると、文字化けする字が発生します。具体的には、以下の通りです。 事例1 ・変換前(utf-8) book_style="文庫,新書,雑誌,ムック,ソフトカバー,ソフトカバー大型本,ハードカバー,ハードカバー大型本,絵本" ・変換後(sjis) book_style="文庫,新書,雑誌,ムック,ャtトカバー,ャtトカバー大型本,ハードカバー,ハードカバー大型本,絵本" 事例2 ・変換前(utf-8) ;詳細侮ヲの最大表示件数 ・変換後(sjis) ;詳細侮ヲの最大侮ヲ件数 該当するプログラム文は、以下の通りです。 $filepath = "setting.ini"; $string = $total_gyo;//ここで出力内容を代入します $string = mb_convert_encoding($string, "sjis-win", "utf-8"); $string = stripslashes($string); $fp = fopen($filepath, "w"); @fwrite( $fp, $string, strlen($string) ); fclose($fp); 各行分割して代入しても、全行一括で代入文字化けの発生状況は同じでした。 以上、どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Excel 2007 VBAで実行時エラー

    Excel 2007のVBAで、EUCコードの変換を試す下記コードの(6)行に「実行時エラー '424' オブジェクトが必要です」となります。 修正方法を教えて頂きたくよろしくお願い致します。 (1) Sub Test() (2) Dim str As String (3) Dim bytesData(1) As Byte (4) bytesData(0) = &HC0 (5) bytesData(1) = &HA4 (6) str = System.Text.Encoding.GetEncoding(51932).GetString(bytesData) (7) MsgBox str (8) End Sub

  • 文字コードsjisをUTF8に書き換えたい

    CGIの勉強中の者です。 文字コードはSJISで保存しているCGIをUTF8コードに換えるには何が必要でしょうか? HTMLならmeta内をSJISからUTF8に変更し、TeraPadなどのテキストエディタでUTF8に保存すればオッケーなんですが。 CGIの場合はHTMLと違って、換えるには複雑なのでしょうか? CGIプログラムの中では以下の「sjis」を「UTF8」に書き換えし、UTF8で保存しましたけど、文字化けが出てます。 <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; 宜しくお願いします。

    • 締切済み
    • CGI
  • 文字コードについて

    非常に初歩的なことですが教えてください。 漢字コード表等でみると「毎」は「6BCE」(UTF-16)表記されていますが実際のプログラム等で中身を見てみると「CE6B」となります。 これは漢字コード表を見る際には右バイトから見る決まりがあるという事でしょうか? 例えば以下の様なコードを実行すると -----以下はVB.NETのコード Dim str As String = "毎" Dim bytesData As Byte() 'UTF-8として変換 bytesData = System.Text.Encoding.Unicode.GetBytes(str) 'バイト配列を16進にて1バイト目から表示 Debug.Write(Hex(bytesData(0)) & Hex(bytesData(1))) ----- 結果は以下の様な内容になります。 CE6B

  • Shift-JISからUTF-8への変換が出来ません

    初歩的な質問で申し訳ありませんが、大変困っております。ただいまimagettftext()を使って日本語主力したく悪戦苦闘しております。  ページ自体はShift-JISで制作していますのでimagettftext()で日本語を出力する場合はUTF-8へ変換して出力するところまでは知れべていて分かりました。しかしいざmb_convert_encoding()で変換しようとするとなぜかUTF-8へ変換されません。 $str = mb_convert_encoding($str,"UTF-8","SJIS"); print mb_detect_encoding($str);  結果→SJIS しかしこれがEUC-JPなら変換されます。 $str = mb_convert_encoding($str,"EUC-JP","SJIS"); print mb_detect_encoding($str);  結果→EUC-JP なぜなのか原因が分からなく困っております。 どなたかご教授願いませんでしょうか? よろしくお願い致します。

    • 締切済み
    • PHP
  • HP毎にエンコードを切り替えるには?

    現在以下の様にHTMLソースを表示しているのですが ページによって"Shift_JIS"や"EUC-JP"等文字コードが違っているため 表示されるHTMLが文字化け状態になる場合があります。 対象となるHPの文字コードを取得して エンコード部分を切り分けたいと思っているのですが 何か良い方法はないでしょうか? Dim SampleWebClient As New System.Net.WebClient Dim SampleByte As Byte() Dim strHtml As String '■URLからデータ取得 SampleByte = SampleWebClient.DownloadData(TextBox2.Text) '■エンコード strHtml = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(SampleByte) '■HTMLソースの表示 TextBox1.Text = strHtml.Replace(vbCr, vbCrLf).Replace(vbLf, vbCrLf)

専門家に質問してみよう