• 字符串与byte[]之间的转换


    一、  编码

    同一个字符在不同的编码下会被编成不同长度的编码,比如:

    ACSII,每个字符对应一个字节,实际上只使用了7位,从00h-7Fh。只能表达128个字符。

    GB2312,中文的一种编码,每个字符使用两个字节表示。

    UTF-8, 可以表达所有unicode字符,每个字符可以用1-3个字节表示。

    UTF-16, 可以表达所有unicode字符,每个字符可以用1-2个16位整数表示。

    UTF-32, 可以表达所有unicode字符,每个字符可以用1个32位整数表示。

    Windows内部支持以下编码:

    Code Page

    Name

    Display Name

    936

    gb2312

    Chinese Simplified (GB2312)

    1149

    IBM01149

    IBM EBCDIC (Icelandic-Euro)

    1200

    utf-16

    Unicode

    1201

    unicodeFFFE

    Unicode (Big-Endian)

    1252

    Windows-1252

    Western European (Windows)

    10003

    x-mac-korean

    Korean (Mac)

    10008

    x-mac-chinesesimp

    Chinese Simplified (Mac)

    20127

    us-ascii

    US-ASCII

    20936

    x-cp20936

    Chinese Simplified (GB2312-80)

    20949

    x-cp20949

    Korean Wansung

    28591

    iso-8859-1

    Western European (ISO)

    28598

    iso-8859-8

    Hebrew (ISO-Visual)

    38598

    iso-8859-8-i

    Hebrew (ISO-Logical)

    50220

    iso-2022-jp

    Japanese (JIS)

    50221

    csISO2022JP

    Japanese (JIS-Allow 1 byte Kana)

    50222

    iso-2022-jp

    Japanese (JIS-Allow 1 byte Kana - SO/SI)

    50225

    iso-2022-kr

    Korean (ISO)

    50227

    x-cp50227

    Chinese Simplified (ISO-2022)

    51932

    euc-jp

    Japanese (EUC)

    51936

    EUC-CN

    Chinese Simplified (EUC)

    51949

    euc-kr

    Korean (EUC)

    52936

    hz-gb-2312

    Chinese Simplified (HZ)

    54936

    GB18030

    Chinese Simplified (GB18030)

    57002

    x-iscii-de

    ISCII Devanagari

    57003

    x-iscii-be

    ISCII Bengali

    57004

    x-iscii-ta

    ISCII Tamil

    57005

    x-iscii-te

    ISCII Telugu

    57006

    x-iscii-as

    ISCII Assamese

    57007

    x-iscii-or

    ISCII Oriya

    57008

    x-iscii-ka

    ISCII Kannada

    57009

    x-iscii-ma

    ISCII Malayalam

    57010

    x-iscii-gu

    ISCII Gujarati

    57011

    x-iscii-pa

    ISCII Punjabi

    65000

    utf-7

    Unicode (UTF-7)

    65001

    utf-8

    Unicode (UTF-8)

    65005

    utf-32

    Unicode (UTF-32)

    65006

    utf-32BE

    Unicode (UTF-32 Big-Endian)

    目前Windows的内核已经采用Unicode编码,这样在内核上可以支持全世界所有的语言文字。但是由于现有的大量程序和文档都采用了某种特定语言的编码,例如gb2312,Windows不可能不支持现有的编码,而全部改用Unicode。

    Windows使用上面表格所示的代码页(code page)来适应各个国家和地区。Windows使用默认代码页来表示当前操作系统的使用的语言,这可以在控制面板的“区域和语言选项”中选择。一般中文windows操作系统,选择“中文(中国)”,这样设置,windows的默认代码页就是936,即gb2312。

    Windows按照当前的缺省代码页去解释文本文件里的字节流。缺省代码页可以通过控制面板的区域选项设置。记事本的另存为中有一项ANSI,其实就是按照缺省代码页的编码方法保存。

    Windows的内码是Unicode,它在技术上可以同时支持多个代码页。只要文件能说明自己使用什么编码,用户又安装了对应的代码页,Windows就能正确显示,例如在HTML文件中就可以指定charset。

    字节序

    UTF-8是单字节的编码,不用考虑字节顺序,但是UTF-16和UTF-32是16位和32位的编码,每个编码内部都有个字节顺序的问题。比如字符”A” (U+0041),在序列化时是”00”在前还是”41”在前,这就有两种可能。

    UTF-16 big-endian byte order: 00 41

    UTF-16 little-endian byte order: 41 00

    规范规定了一个可选的方案,就是在编码前导几个字符放上本身不是UTF可能编码的前导编码来帮助判断识别。

    UTF-8: EF BB BF

    UTF-16 big-endian byte order: FE FF

    UTF-16 little-endian byte order: FF FE

    UTF-32 big-endian byte order: 00 00 FE FF

    UTF-32 little-endian byte order: FF FE 00 00

    二、  需要把string转换为byte[]使用的场景

    任何需要把string序列化处理都需要这种转换,比如:

    需要把string保存到文件中,必须把string转换成一个有序的字节流,以便系统在硬盘上做物理保存。

    对string做加密操作时,加密算法是针对字节进行处理,这时也需要把string转换成字节流以便加密算法对数据进行处理。

    String到字节流的转换涉及到使用何种编码,使用不同的编码得到的字节码不同,再从字节码做反操作恢复成string,必须使用编码时使用的编码或者兼容的编码,否则结果就是乱码。

    三、  string转换为byte []的操作

    1、 确定使用的编码

    使用Encoding类的静态方法GetEncoding方法获得某个类型的Encoding对象。

    l         public static Encoding.GetEncoding(int codepage)

          codepage指定这种返回代码页的Encoding

    l         public static Encoding GetEncoding (string name)

          name 指定这种返回代码名的Encoding

    其中使用到的代码页和代码名在上面表中。

    比如要获得一个utf-8的Encoding对象

    Encoding myEncoding = Encoding.GetEncoding("utf-8");

    2、 从string到byte[]

    string sData = “字符串”;

    byte[] myByte = myEncoding.GetBytes(sData);

    使用GetBytes方法时,不产生前面所说的识别不同UTF格式的前导符。

    3、 从byte[]到string

    byte[] myByte = new byte[]{};

    string sData = myEncoding.GetString(byte[] myByte);

  • 相关阅读:
    Thinkphp3.2.3如何加载自定义函数库
    mysql 字段引号那个像单引号的撇号用法
    php cli模式学习(PHP命令行模式)
    Django model 表与表的关系
    Django model 字段详解
    Django model 中的字段解释
    python系列-1 字符串操作
    nginx-匹配规则
    ansible系列3-pyYAML
    ansible系列2-常用命令
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/10007121.html
Copyright © 2020-2023  润新知