C# 소문자 인코딩(2)

10989 단어 encoding

인코딩 사용 방법


인코딩 사용법은 비교적 간단합니다. 만약 바이트와 문자의 상호 변환만 있다면, GetBytes () 와 GetChars () 두 가지 방법과 그것들의 재부팅은 기본적으로 당신의 모든 요구를 만족시킬 것입니다.
GetByteCount() 및 재부팅은 문자열을 바이트로 변환할 때 실제 바이트 개수입니다.
GetCharCount() 및 재부팅은 바이트 그룹을 문자열로 변환하는 크기입니다.
이 두 가지 방법을 주의해야 한다. int GetMaxByteCount(int charCount);int GetMaxCharCount(int byteCount);
그것은 당신이 원하는 것이 아닙니다. 한 바이트면charCount를 되돌려주고, 두 바이트면chartCount*2를 되돌려주고,chartCount+1,(chartCount+1)*2를 되돌려줍니다.
            Console.WriteLine("The max byte count is {0}.", Encoding.Unicode.GetMaxByteCount(10));

            Console.WriteLine("The max byte count is {0}.", Encoding.ASCII.GetMaxByteCount(10));

위의 결과는 각각 22와 11이지 20, 10이 아니다.나는 영어 블로그에서 원인을 찾았다. 나는 영어를 잘 못해서 하이서로게이트와 로우서로게이트가 무엇인지 알지 못했다http://blogs.msdn.com/b/shawnste/archive/2005/03/02/383903.aspx
       For example, Encoding.GetEncoding(1252).GetMaxByteCount(1) returns 2.  1252 is a single byte code page (encoding), so generally one would expect that GetMaxByteCount(n) would return n, but it doesn't, it usually returns n+1.
     One reason for this oddity is that an Encoder could store a high surrogate on one call to GetBytes(), hoping that the next call is a low surrogate.  This allows the fallback mechanism to provide a fallback for a complete surrogate pair, even if that pair is split between calls to GetBytes().  If the fallback returns a ? for each surrogate half, or if the next call doesn't have a surrogate, then 2 characters could be output for that surrogate pair.  So in this case, calling Encoder.GetBytes() with a high surrogate would return 0 bytes and then following that with another call with only the low surrogate would return 2 bytes.
다음 코드는 Encoding의 간단한 응용 프로그램입니다. 여러분은 결과를 인쇄한 후에 위에서 말한 것과 결합하면 성과를 얻을 수 있습니다.
        static void Output(Encoding encoding,string t)

        {

            Console.WriteLine(encoding.ToString());

            byte[] buffer = encoding.GetBytes(t);

            foreach (byte b in buffer)

            {

                Console.Write(b + "-");

            }

            string s = encoding.GetString(buffer);

            Console.WriteLine(s);

        }
            string strTest = "test a κ";

            Console.WriteLine(strTest);

            Output(Encoding.GetEncoding("gb18030"), strTest);

            Output(Encoding.Default, strTest);

            Output(Encoding.UTF32, strTest);

            Output(Encoding.UTF8, strTest);

            Output(Encoding.Unicode, strTest);

            Output(Encoding.ASCII, strTest);

            Output(Encoding.UTF7, strTest);

BOM 정보


BOM은 전적으로 Byte Order Mark, 즉 바이트 순서 표시라고 하는데 바이너리로 텍스트가 어떤 인코딩을 하는지 표시하는 데 사용된다. 예를 들어 Notepad로 텍스트를 열 때 텍스트에 이 BOM이 포함되면 어떤 인코딩 방식을 사용하는지 판단하고 해당하는 디코딩 방식을 사용하면 텍스트를 정확하게 열 수 있다.만약 이 BOM이 없다면, Notepad는 기본적으로 ANSI로 열립니다. 이런 것은 혼란스러울 가능성이 있습니다.인코딩 방법인 GetPreamble () 를 통해 이 인코딩에 BOM이 있는지 판단할 수 있습니다. 현재 CLR에는 아래 5개의 인코딩에만 BOM이 있습니다.
UTF-8: EF BB BF
UTF-16 big endian: FE FF
UTF-16 little endian: FF FE
UTF-32 big endian: 00 00 FE FF
UTF-32 little endian: FF FE 00 00
Encoding의 정적 속성인 Unicode, UTF8, UTF32로 구성된 Encoding은 기본적으로 BOM을 가지고 있습니다. 만약 텍스트를 쓸 때 (예를 들어 XML 파일, BOM이 있으면 혼란이 있을 것), BOM을 가지고 싶지 않으면 반드시 그것들의 실례를 사용해야 합니다.
Encoding encodingUTF16=new UnicodeEncoding(false, false);// false



Encoding encodingUTF8=new UTF8Encoding(false);



Encoding encodingUTF32=new UTF32Encoding(false,false);// false

텍스트와 BOM의 관계를 읽고 쓰는 것은 정원에 있는 이 블로그를 참고할 수 있습니다. 상세하게 말하면 저는 반복하지 않겠습니다.NET(C#): 문자 인코딩(Encoding) 및 바이트 순서 표시(BOM)

텍스트를 판단하는 인코딩 방식


만약 텍스트를 지정한다면, 우리는 그것의 인코딩 형식을 모른다. 인코딩을 할 때 우리는 어떻게 Encoding을 선택합니까?답은 BOM에 따라 어떤 유니코드인지 판단하는 것입니다. BOM이 없으면 글쎄요. 이것은 텍스트 파일의 출처에 따라 결정해야 합니다. 보통 엔코딩을 사용합니다.Default, 이것은 컴퓨터의 현재 설정에 따라 다른 값을 되돌려줍니다.만약 당신의 파일이 국제 친구로부터 왔다면, 당신은 UTF-8로 디코딩하는 것이 가장 좋습니다.다음 코드는 지정한 파일에 BOM이 없을 때 정확성을 보장할 수 없습니다. 프로젝트에 사용하려면 이 점을 주의하십시오.
/// <summary>

        ///Return the Encoding of a text file.  Return Encoding.Default if no Unicode

        // BOM (byte order mark) is found.

        /// </summary>

        /// <param name="FileName"></param>

        /// <returns></returns>

        public static Encoding GetFileEncoding(String FileName)

        {

            Encoding Result = null;

            FileInfo FI = new FileInfo(FileName);

            FileStream FS = null;

            try

            {

                FS = FI.OpenRead();

                Encoding[] UnicodeEncodings =

                { 

                    Encoding.BigEndianUnicode, 

                    Encoding.Unicode,

                    Encoding.UTF8,

                    Encoding.UTF32,

                    new UTF32Encoding(true,true)

                };

                for (int i = 0; Result == null && i < UnicodeEncodings.Length; i++)

                {

                    FS.Position = 0;

                    byte[] Preamble = UnicodeEncodings[i].GetPreamble();

                    bool PreamblesAreEqual = true;

                    for (int j = 0; PreamblesAreEqual && j < Preamble.Length; j++)

                    {

                        PreamblesAreEqual = Preamble[j] == FS.ReadByte();

                    }

                    // or use Array.Equals to compare two arrays.

                    // fs.Read(buf, 0, Preamble.Length);

                    // PreamblesAreEqual = Array.Equals(Preamble, buf)

                    if (PreamblesAreEqual)

                    {

                        Result = UnicodeEncodings[i];

                    }

                }

            }

            catch (System.IO.IOException ex)

            {

                throw ex;

            }

            finally

            {

                if (FS != null)

                {

                    FS.Close();

                }

            }

            if (Result == null)

            {

                Result = Encoding.Default;

            }

            return Result;

        }

계속 기다리다
다음은 Encoder 및 Decoder
겸사겸사 블로그를 편집할 때 보기에 매우 아름다운 문장인데, 어떻게 미리 볼 때 많은 격식이 없어졌습니까?못생겼다.

좋은 웹페이지 즐겨찾기