C++ 符合BOM表时匹配Unicode代码点的约定?

C++ 符合BOM表时匹配Unicode代码点的约定?,c++,c,string,unicode,C++,C,String,Unicode,在具有相关BOM(UTF-16/32)的Unicode字符串中搜索代码点时,保持编码不变并将代码点与字符串的BOM匹配是有意义的 例如,我想修剪前导和尾随的斜杠字符 (伪代码) 对于前面的代码点,我会跳过BOM表,如果我想提取一个子字符串,我会简单地将BOM表重新添加 我将LLVM中的ConvertUTF.cpp用于UTF操作,在编码之间转换时,它似乎尊重BOM,但在与字符串文本和其他来源的字符串进行比较时,我仍然需要考虑字节顺序 我这样做是否正确?我的努力是否合理?我想确保尽可能正确地处理Un

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

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

(伪代码)

对于前面的代码点,我会跳过BOM表,如果我想提取一个子字符串,我会简单地将BOM表重新添加

我将LLVM中的ConvertUTF.cpp用于UTF操作,在编码之间转换时,它似乎尊重BOM,但在与字符串文本和其他来源的字符串进行比较时,我仍然需要考虑字节顺序

我这样做是否正确?我的努力是否合理?我想确保尽可能正确地处理Unicode

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

使用UTF-32,如果考虑BOM,每次调用的最小拷贝数为3份,


此外,UTF格式之间的转换可能会导致字符串与原始表示不对齐(是否具有BOM,无论是否具有BOM或endianess)。

通常,BOM仅与“在线”相关,这意味着它们表示文件的字节顺序、网络数据、,或在系统之间传输的其他协议流(请参阅)

当程序读取此类流时(例如,创建
utf16字符串时),应将其转换为平台的本机字节顺序。也就是说,
string
应始终以本机字节顺序排列,并且BOM表变得不相关。当
字符串
写回文件/网络/流时,应将其从本机字节顺序转换为适合协议的任何顺序(带有BOM)


处理字符串(而不是读/写字节流)的代码应该永远不需要处理非本机字节顺序

避免依赖BOM,但需要明确的编码信息或直接要求UTF-8(最常见的Unicode编码)。此外,在读取字节时,首先将它们规范化为内部表示形式,如UTF-32或UTF-8,当然这两种表示形式都是以其本机字节顺序进行的。类似地,在写入时,仅在最后一步中在文件中创建所需的字节顺序。在内部,避免使用多种不同的文本表示法。这篇关于处理BOM的文章的全部原因来自Unicode标准,该标准建议在BOM存在时不要删除BOM,这样编码之间的往返不会丢失信息,因此依赖它的代码继续工作。这里的概念问题是BOM是“每个文档一次”的东西,而不是“每个字符串一次”。问题是为处理与BOM相关的情况寻找答案。我的回答是,BOM在您的问题所描述的情况下不应该相关。通常,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)
}