zoukankan      html  css  js  c++  java
  • [问题] Delphi关于UTF8String的介绍

    XE(2009及以后) 里的 string 是 UnicodeString,采用的是 winnt 系列的系统内核字符集 utf-16(或称 ucs2)。和 utf-16 le 一样,utf-8 也是一种针对 unicode 字符集的编码,两者表达的范围是相同的。两者的差别主要就在于编码方式,前者基本上可以当作是定长的,而后者的长度是不定的:utf-16 中,一个字符至少两占2字节,还有一些非常偏的字符占4字节(只有2和4两种长度,后者一般人用不到,连支持的字体都不好找);而 utf-8 中一个字符最少占1字节,查了一下10月份刚出的6.0(http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt),unicode 字符现在排到了 U+10FFFD,也就意味着目前最多占4字节(一般的汉字占3字节)。两者表达的都是 unicode 字符集,只是表达方式不同而已,不存在哪个比哪个更兼容。
    由于 utf-8 的编码方式与机器的 endian 无关,并且容易检验完整性,因此在传输上 utf-8 有非常大的优势;另外,又由于许多文本中主要字符都是 ASCII 那些,所以在某些情况下的空间占用方面(尤其对美欧来说),utf-8 也有优势。
    在 win 平台想要通过 winapi 显示字符的话,最终使用的都是 utf-16 的字符串(***A 版本在 api 内部转成 unicode)。因此一般情况下,可视化控件之类,直接使用 UnicodeString 是最方便的,只在储存和传输时转成 utf-8 就可以了。
    在库中使用 UTF8String 肯定要仔细权衡的,而不是随随便便就说哪个一定比另外一个好。在一些情况下,核心处理功能在库内部,占用大量时间,迁移 unicode 版本的难度非常大,或者占用更多内存,但效果又不一定好。这时候不如保留原来的 ANSI 版本库,稍作修改就可以支持 utf-8,不但支持了 unicode,内存占用没什么变化,代码也没做多大修改。
    最常见的应用就是字符串匹配,比如基于 B-M 算法的子串匹配,由其算法的原理决定,如果不采用 Integer*64k 的空间对 utf-16 进行匹配,对于纯 ASCII 字符的搜索,就无法保证每次移动都是最大可移动距离,算法自身的性能发挥不出来;但一次 256k 的空间占用又有点浪费内存,初始化的常数时间长,并且 CPU cache 装这么多数据也影响后面搜索时的性能。采用 utf-8 的话,空间复杂度还是 256*4,常数初始化时间不变,每次移动也基本上能保证较长的长度。所以比较复杂的字符串算法在支持 unicode 方面,直接采用 utf-16 的很少,而用 utf-8 的比较多。
    再就是同时要考虑内存占用的场景,正常情况下绝大多数内容都是 ASCII 字符,使用 utf-16 过于浪费空间。常见的应用是词法处理,比如编译器或者 html、xml 等的词法扫描器。
    正则表达式是符合上面所有描述的应用,自动机的构造和转换非常复杂(词法扫描也是用自动机),由 ANSI 迁移至 utf-16 的难度大,空间复杂度也大大增加了。

    问题来自http://bbs.2ccc.com/topic.asp?topicid=369604

  • 相关阅读:
    LeetCode Count of Range Sum
    LeetCode 158. Read N Characters Given Read4 II
    LeetCode 157. Read N Characters Given Read4
    LeetCode 317. Shortest Distance from All Buildings
    LeetCode Smallest Rectangle Enclosing Black Pixels
    LeetCode 315. Count of Smaller Numbers After Self
    LeetCode 332. Reconstruct Itinerary
    LeetCode 310. Minimum Height Trees
    LeetCode 163. Missing Ranges
    LeetCode Verify Preorder Serialization of a Binary Tree
  • 原文地址:https://www.cnblogs.com/huangjacky/p/1913251.html
Copyright © 2011-2022 走看看