zoukankan      html  css  js  c++  java
  • Regex对Unicode的支持和Unicode的BOM

    我们知道正则式可以用\uxxxx来表示Unicode编码,比如用[\u4e00-\u9fa5] 来表示双字节字符。

    博客园有位朋友留言问我Regex怎么支持Unicode,于是我想取出一个汉字的Unicode编码,写到Regex 的Pattern中,来说明这个问题。
                string s = "";
                
    byte[] bs = Encoding.Unicode.GetBytes(s);
                
    for(int i = 0 ; i < bs.Length ;i++)
                
    {
                    Console.Write(bs[i].ToString(
    "X"));
                }

    返回的结果是2D4E,
    然后我写正则式来匹配它

                string s = "";
                Regex reg 
    = new Regex(@"\u2d4e",RegexOptions.Compiled);
                WL(reg.IsMatch(s));
    结果却返回False!!

    想了半天,记起Unicode的字节存放有前高后低(前一字节放高位后一字节放低位)和前低后高两种,于是把字节前后对换

                string s = "";
                Regex reg 
    = new Regex(@"\u4e2d",RegexOptions.Compiled);
                WL(reg.IsMatch(s));
    此时,返回的是希望看到的True。

    后来通过查看
                Encoding unicode = Encoding.Unicode;

                
    // Get the byte order mark (BOM) of the Unicode encoder. 
                byte[] preamble = unicode.GetPreamble();

                
    if(preamble[0== 0xFE && preamble[1== 0xFF)
                
    {
                    Console.WriteLine(
    "The Unicode encoder is encoding in big-endian order.");
                }

                
    else if(preamble[0== 0xFF && preamble[1== 0xFE)
                
    {
                    Console.WriteLine(
    "The Unicode encoder is encoding in little-endian order.");
                }
    得知.NET下的Unicode编码默认采用little-endian顺序。

    看到得去补补编码知识了。
  • 相关阅读:
    struct2 学习总结
    c++ 容器(list学习总结)
    java 网络编程(五)----TCP进阶篇上传文本文件
    java 网络编程(四)----UDP进阶篇聊天小程序
    java 网络编程(三)---TCP的基础级示例
    java 网络编程(二)----UDP基础级的示例
    java 网络编程(一)---基础知识和概念了解
    GitHub和git和repo的使用
    android studio不能预览
    关于android studio2.3和android studio3.0
  • 原文地址:https://www.cnblogs.com/think/p/443305.html
Copyright © 2011-2022 走看看