在遵守BOM的同时匹配Unicode代码点的约定?

时间:2016-01-18 07:28:51

标签: c++ c string unicode

在使用相关BOM(UTF-16/32)的Unicode字符串中搜索代码点时,将编码保持原样并将代码点与字符串的BOM匹配是有意义的。

例如,我想修剪前导和尾随斜杠字符。

(伪代码)

utf16 trim_slash(utf16 string) {
   bom = bom_from_strong(string)
   utf16_slash = utf16_byte_order("/", bom)

   offset = 0

   search codepoint from right
      if codepoint[i] = utf16_slash
         offset++

   if offset
      string = string.substr(0, len(string) - offset)
}

为了对前面的代码点做同样的事情,我会跳过BOM,如果我想提取子字符串,我只需要重新添加BOM。

我正在使用来自LLVM的ConvertUTF.cpp进行UTF操作,这似乎在编码之间进行转换时会考虑BOM,但在与字符串文字和来自其他来源的字符串进行比较时,我仍需要考虑字节顺序。

我是否以正确的方式解决这个问题并且我的努力是否合理?我想确保尽可能正确地处理Unicode。

我目前正在标准化将所有传入的字符串转换为UTF-32,我需要沿着代码点来比较搜索项,然后提取一些子字符串。但是,当我只需要沿着字符串的开头和结尾(例如示例伪代码)走动时,我发现这是过度的。在这种情况下,如果没有任何变化,只返回相同的字符串要快得多;而对于UTF-32,我必须转换为UTF-32然后回到原始宽度,然后传递最终副本作为结果。

对于UTF-32,如果我考虑BOM,则每次通话最少3个副本,而不是一个副本。

此外,在UTF格式之间进行转换可能会导致字符串无法与原始表示对齐(无论是否有BOM,无论是否为endianess)。

1 个答案:

答案 0 :(得分:2)

通常,物料清单仅与电线相关"这意味着它们在系统之间传输时发出文件,网络数据或其他协议流的字节顺序信号(参见the Unicode FAQ)。

当程序读取此类流时(例如,在创建utf16 string时),应将其转换为平台的本机字节顺序。也就是说,string应始终采用本机字节顺序,并且BOM变得无关紧要。当string写回文件/网络/流时,应将其从本机字节顺序转换为适合该协议的任何内容(使用BOM)。

使用字符串的代码(读取/写入字节流除外)永远不需要处理非本地字节顺序。