C#処理歪みの問題時間シフトJIS UTF-8符号化の変換中

クライアント側の要件は、CSVファイルをエクスポートするため、最近、プロジェクトを行う際に遭遇したCSVファイルをエクスポートするときにShift-JISのはCSVファイルをエンコードし、当社のデータベースに格納されなければならないUnicodeで格納されるため、エクスポートの多くがあるでしょう?コーディング、どの理由は次のとおりです。

説明するために、コード表を泊まります:

シフトJIS

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

00

NUL

SOH

STX

ETX

ROT

ENQ

ACK

BEL

BS

HT

LF

VT

FF

CR

そう

10

DLE

DC1

DC2

DC3

DC4

NAK

SYN

ETB

できる

、IN

サブ

ESC

FS

GS

RS

米国

20

SP

"

$

"

*

+

-

/

30

0

1

2

3

4

5

6

7

8

9

;

<

=

>

40

@

A

B

C

D

E

F

G

H

J

K

L

M

N

ザ・

50

P

Q

R

S

T

ザ・

V

W

バツ

とともに

[

¥

]

^

_

60

`

A

B

C

D

E

F

グラム

時間

J

K

リットル

メートル

n個

インクルード

70

P

Q

R

S

トン

V

ワット

バツ

から

{

|

}

THE

80

90

A0

B0

ソ

C0

D0

E0

F0

 

Shift_JISのは、日本のコーディングテーブルで使用されるコンピュータシステムです。それは半分の幅とダブルラテン、ひらがな、カタカナ、漢字のシンボルを収容することができます。

その理由は、それはShift_JISの名前が付けられ、もともと置か0xA1-0xDFで半角カナ文字を避けるために、完全な形の文字でそれを置きました。

このコード表を使用し、日本のコンピュータシステムでMicrosoftとIBM。呼ばれるこのコード表CP932

Wordは結節の設定を

これらの文字は、バイトのShift_JISを示すために使用されています。

交換するASCII文字(0x20-0x7E)が、 "/" です "¥"

ASCII制御文字(0x00-0x1F、0x7Fの)

標準でJIS X 0201と半角カタカナの句読点(0xA1-0xDF)

オペレーティングシステムの一部では、0xA0をを配置するために使用される「非改行スペースを。」

Shift_JISの文字で、次の2つのバイトは表現します。

すべての文字のJIS X 0208文字セット

0x81-0x9F、0xE0-0xEFを使用して "最初のバイト"(合計47)

0x40-0x7E、0x80-0xFC(合計188)を用いる "第二バイト"

ユーザー定義のエリア

0xF0-0xFCを使用した「最初のバイト」(合計47)

0x40-0x7E、0x80-0xFC(合計188)を用いる "第二バイト"

シフトJISコードテーブルにおいて、0xFDでは、0xFEのと0xFFでは使用されません。

MicrosoftとIBM JIS X 0208 388の記号や文字を追加する日本のコンピュータシステム、0xFA、0xFB 0xFCと2バイトの領域は、含まれておりません。

 

ユニコードのコーディングの多くとシフトJISはシフトJISには対応するトランスコーディングを切り替えていないときに、使用するので、63バイトに変換したときに交換することになっているしていないので、それは何ですか?これらのデータは、我々が明示的にすることができ、対応する文字に置き換えシフトJISに対応したオリジナルのバイトコードの文字列を保持しているため、表示されています。

 

次のように私たちのデザインのアイデアは、次のとおりです。

図1に示すように、変換テーブルと置換される保存された符号化テーブルと文字テーブルを処理します。

トランスコード処理を処理するための2つの方法で2、。

     A:それはいくつかの特別な文字列を発揮しなかった、置き換えられたが、彼は、このような無コーディング対応するヌル文字、0xA0を、シフトJISとして、存在しているコードします。UTF-8などのいくつかの特殊文字は、新しいバイト[] {0xEFという、0xbb、0xbfの}空の文字列です。

     B:変換前の文字列を置換します。賃金は、いくつかの明白な単語列を格納することができます。~~直接置き換える置き換え置き換え。

 

問題は、我々はこのような文字列0xbfの、どのようにそれを新しいバイト[] {0xEFという、0xbb、0xbfのを}に変換するために、0xEFという、0xbbのようなテーブルに保存することができ、続くのだろうか?

次のように我々が対処方法は、以下のとおりです。

        private byte[] ConvertStringToByte(string originalStr)
        {
            if (string.IsNullOrEmpty(originalStr)) return null;
            string[] originalSplit = originalStr.Split(',');            
            int originalFirstValue = 0, originalSecondValue = 0, originalThirdValue = 0;
            byte[] resultByte;
            originalFirstValue = Convert.ToInt32(originalSplit[0].Trim(), 16);
            if (originalSplit.Length == 2)
            {
                originalSecondValue = Convert.ToInt32(originalSplit[1].Trim(), 16);
                resultByte = new byte[] { BitConverter.GetBytes(originalFirstValue)[0], BitConverter.GetBytes(originalSecondValue)[0] };
            }
            else  if (originalSplit.Length == 3)
            {
                originalSecondValue = Convert.ToInt32(originalSplit[1].Trim(), 16);
                originalThirdValue = Convert.ToInt32(originalSplit[2].Trim(), 16);
                resultByte = new byte[] { BitConverter.GetBytes(originalFirstValue)[0], BitConverter.GetBytes(originalSecondValue)[0], BitConverter.GetBytes(originalThirdValue)[0] };
            }
            else
            {
                resultByte = new byte[] { BitConverter.GetBytes(originalFirstValue)[0] };
            }
            return resultByte;
        }

 

 

 

受信コードに対応するにバイトストリーム。そして、ほとんど限り、我々は交換するコードを記述するためのロジックを処理しているよう。

コードは以下の通りであります:

       public string ReplaceString(string content)
        {
            List<MessyCodeHandleBE> messyCodeHandleBEList = RetrieveAll();

            foreach (MessyCodeHandleBE entity in messyCodeHandleBEList)
            {
                if (entity.ConvertType == MessyCodeHandleConvertTypeChoices.ENCODEREPLACE)
                {
                    content = content.Replace(Encoding.UTF8.GetString(ConvertStringToByte(entity.OriginalCode)), entity.ReplaceCode);
                }
                else
                {
                    content = content.Replace(entity.OriginalCode, entity.ReplaceCode);
                }
            }
            return content;
        }

 

そして、特殊な文字エンコーディングを取得する方法を次のように独自のコードでは、次のコードでありに従って計算することができます。

        private string ConvertToShiftJis(string content)
        {
            Encoding orginal = Encoding.GetEncoding("utf-8");
            Encoding ShiftJis = Encoding.GetEncoding("Shift-JIS");
            byte[] unf8Bytes = orginal.GetBytes(content);
            byte[] myBytes = Encoding.Convert(orginal, ShiftJis, unf8Bytes);
            string JISContent = ShiftJis.GetString(myBytes);
            return JISContent;
        }

 

示すように、デバッグのバイトコードを参照してください。

画像

 

239は、16進0xEFという、16進187は0xbbある16進、191は0xbfのです。

 

概要

検索文字列は、対応するShift-JISの何時に対応する63バイト[]バイトとしてエンコードし、[OK]を置き換え置き換えています。あなたはどんな新しい発見、ウェルカムメッセージ交換を持っている場合。

 

 

著者:春ヤン

出典:http://www.cnblogs.com/springyangwc/

この記事では、著者とブログパークの合計に属し転載を歓迎しますが、この節で宣言され、著者の同意なしに保持され、記事ページの見かけ上の位置にある元の接続、法的責任を追及するそうでない場合は権利を与えられなければなりません。

ます。https://www.cnblogs.com/springyangwc/archive/2011/07/05/2098053.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_34221276/article/details/93340925