- - PR -
Encodingクラスで文字コードが変わってしまう
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-10-22 18:05
C++/CLIで開発していおり、掲題の件が発生して困っています。
EncodingクラスのGetStringメソッドにて、Byte配列からStringへ値を格納する際に、 文字コード"EAE2"だったものが"8152"に変わってしまいます。 (EAE2は第二水準の文字コードで、通常は空エリアですが文字を割り当てています) 外字エリアについてはそのままの文字コードで取得できるのですが、 上記のような現象が起きる理由・回避策をご存知の方はご教授ください。 よろしくお願いいたします。 | ||||
|
投稿日時: 2008-10-22 19:31
何がしたくて、どの様なコードを、どうなる事を期待して書いたのでしょう?
外字エリアに関してはわかりませんが、なんにしてもそのまま出てきたら、別の文字に化けてしまうと思います。 | ||||
|
投稿日時: 2008-10-22 19:53
理由は、文字が Shift_JIS として未定義なので代替できる Unicode 文字も存在しないため、デコード時に中黒に置き換えるからです。
DecoderFallback を自前で実装すれば、デコード時にデコード不能文字を処理することができます。 | ||||
|
投稿日時: 2008-10-22 23:39
Jittaさん、Hongliangさん、ご回答ありがとうございます。
DecoderFallback ですね。知りませんでした。 調査してみたところ、 ・DecoderReplacementFallback でデコード不能文字を置き換える ・例外(DecoderFallbackException)を発生させる はできるようですが、デコード不能文字をそのままの文字コードで 出力することはできないようです。無理なのでしょうか? やろうとしているのは、 バイナリファイルを読み込みテキストファイルへ出力する処理 です。文字コードはどちらのファイルもShiftJISになっています。 | ||||
|
投稿日時: 2008-10-23 03:13
1)バイナリファイルを読み込む段階で1バイトずつ読んでデコード不能文字の位置を記録しつつ、適当な文字に置換 2)必要な処理を行ったあと、書き出す前に一旦byte[]にいれてデコード不能で記録した文字があるべき位置に外字の値をいれる こんな感じでしょうか?もうちょっと良い方法があるかも・・・。 バイナリから読み込んだあとに文字列を切ったり貼ったりすると「デコード不能文字の位置を記録した値」もそれにあわせて弄る必要があるので、処理はかなり煩雑になりますし。 | ||||
|
投稿日時: 2008-10-23 07:47
テキスト ファイルも、バイナリ ファイルです。特定の規則で人間にとって意味のあるバイナリが並んでいるに過ぎません。英語圏の人にとっては、shift JIS のテキスト ファイルは、バイナリ ファイルと変わらないのです。 で、何がしたいのでしょう?バイナリとして扱って、一部だけ抜き出せばいいのでは? |
1