如何编写对 UTF-8 安全的代码?

2024-05-08

我们有一组针对 ASCII 字符集开发的应用程序。现在,我们正尝试在冰岛安装它,但遇到了冰岛字符被搞砸的问题。

我们正在解决我们的问题,但我想知道:是否有一个好的“指南”来编写专为 8 位字符设计的 C++ 代码,并且在提供 UTF-8 数据时可以正常工作?

我不能指望每个人都能阅读整个 Unicode 标准,但如果有更容易理解的内容,我想与团队分享,这样我们就不会再次遇到这些问题。

目前重写所有应用程序以使用 wchar_t 或其他字符串表示形式是不可行的。我还要指出的是,这些应用程序通过网络与使用 8 位字符的服务器和设备进行通信,因此即使我们在内部使用 Unicode,我们仍然会遇到边界翻译问题。大多数情况下,这些应用程序只是传递数据;除了将文本从一个地方复制到另一个地方之外,他们不会以任何方式“处理”文本。

使用的操作系统是Windows和Linux。我们使用 std::string 和普通的 C 字符串。 (不要要求我为任何设计决策辩护。我只是想帮助解决这个问题。)


以下是建议内容的列表:

  • 每个软件开发人员绝对必须了解 Unicode 和字符集的绝对最低限度(没有任何借口!) http://www.joelonsoftware.com/articles/Unicode.html
  • Unix/Linux 的 UTF-8 和 Unicode 常见问题解答 http://www.cl.cam.ac.uk/~mgk25/unicode.html
  • 统一码指南 ftp://ftp.ilog.fr/pub/Users/haible/utf8/Unicode-HOWTO.html

大多数情况下,只需保持 8 位干净即可。但是,您必须注意任何非 ASCII 字符都会拆分为多个字节,因此如果要换行或截断文本以进行显示,则必须考虑到这一点。

UTF-8 的优点是您始终可以知道多字节字符中的位置:如果设置了位 7 并且重置了位 6(字节为 0x80-0xBF),则这是一个尾随字节,而如果设置了位 7 和位 6,则这是一个尾随字节。置位且 5 复位 (0xC0-0xDF),它是一个前导字节和一个尾随字节;如果设置了 7、6 和 5 并且重置了 4 (0xE0-0xEF),则它是一个前导字节,带有两个尾随字节,依此类推。设置在最高有效位的连续位数是组成字符的字节总数。那是:

110x xxxx = 两字节字符
1110 xxxx = 三字节字符
1111 0xxx = 四字节字符
etc

冰岛字母全部包含在 ISO 8859-1 中,因此也包含在 Windows-1252 中。如果这是控制台模式应用程序,请注意控制台使用 IBM 代码页,因此(取决于系统区域设置)它可能会显示为 437、850 或861 http://en.wikipedia.org/wiki/Code_page_861。 Windows 没有对 UTF-8 的本机显示支持;您必须转换为 UTF-16 并使用 Unicode API。

如果它是控制台模式应用程序,则调用 SetConsoleCP 和 SetConsoleOutputCP 并指定代码页 1252 将有助于解决您的问题。不幸的是,选择的控制台字体必须是支持代码页的字体,并且我看不到设置字体的方法。标准位图字体仅支持系统默认的 OEM 代码页。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写对 UTF-8 安全的代码? 的相关文章

随机推荐

  • UITableView 顶部出现间隙[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我不确定现在问这个问题是否合适 我正在表视图上使用 Xcode 5 预览版 现在的问题是我的表格视图是否被选择为group比我在第一个单元
  • 由于触摸事件上的类切换/高度变化而导致可点击区域错位

    如果您切换上方元素的高度 则触摸设备上的链接可点击区域会出现奇怪的行为 如果您运行以下代码片段 例如 将其保存在本地并使用 chrome 来模拟触摸事件 您会注意到哈希值 mylink在某些情况下 您没有点击红色链接区域 会将 url 添加
  • Android NullPointerException 在视图或适配器中或

    我不知道还能去哪里看 我对这个错误感到疯狂 它不是来自使用空变量 它似乎只是重新启动应用程序而不更改任何代码 有谁知道 java lang NullPointerException Attempt to invoke virtual met
  • 如何在Java中查找年月日中两个日期之间的差异? [复制]

    这个问题在这里已经有答案了 假设我有 Employee模型有开始日期作为其属性变量和晋升型号有促销日期 我想知道员工在晋升之前已经工作了多长时间 我必须找到 PromotionDate 和 startDate 之间的差异 如果我得到 sta
  • HTML 表单:POST 对象数组

    提交班级名单 一次添加3名学生 每个学生都有最初 最后的年龄 问题 我们如何才能将所有学生放入数组中 students 0 gt Array first gt first name for 0 last gt last name for 0
  • C# Winform(实体框架)- 将数据绑定 DataGridView 或 BindingSource 转换为 DataTable

    我正在使用 C Winforms 和实体框架 我的项目基于此链接建模 与 WinForms 的数据绑定 https msdn microsoft com en us data jj682076 aspx 我的问题是如何转换DataGridV
  • 为什么Mysql的Group By和Oracle的Group by行为不同

    为什么Mysql的Group By和Oracle的Group by行为不同 我多次发现 Mysql group By 功能和 Oracle 的 GroupBy 功能表现不同 很多时候我在Oracle中发现错误 这实际上是错误的查询 但是My
  • Magento 2 REST API 客户自定义属性

    Magento 2 REST API 文档解释了在更新或创建客户时设置custom attributes 的方法 http devdocs magento com swagger index 20 html http devdocs mag
  • 循环更改多个数据帧

    例如 我有这三个数据集 就我而言 它们更多并且有很多变量 data frame1 lt data frame a c 1 5 3 3 2 b c 3 6 1 5 5 c c 4 4 1 9 2 data frame2 lt data fra
  • 如何将每个句子的第一个字母大写?

    我正在尝试编写一个程序 将每个句子的第一个字母大写 这是我到目前为止所拥有的 但我不知道如何在句子之间添加句号 例如 如果我输入 你好 再见 输出是 你好再见 并且期间已经消失 string input Enter a sentence s
  • 如何创建自定义 Powershell 运算符?

    是否可以在 Powershell 中创建自定义运算符 而且 我该怎么做呢 我搜索过谷歌 但没有任何结果 我特指一个中缀运算符 示例列表 包含 元素 我已经创建了 cmdlet 使用 Powershell 和 C 模块等 所以我只需要大概的内
  • Python Spark DataFrame:用 SparseVector 替换 null

    在 Spark 中 我有以下名为 df 的数据框 其中包含一些空条目 id features1 features2 185 5 0 1 4 0 1 0 null 220 5 0 2 3 0 1 0 10 1 2 6 0 1 225 null
  • Ruby IMAP IDLE 并发 - 如何解决?

    我正在尝试构建一个 目前是私有的 Web 应用程序 该应用程序将利用 IMAP IDLE 连接在人们到达时显示电子邮件 我很难弄清楚如何将其组合在一起 以及它如何与我的 Heroku RoR 服务器结合在一起 我编写了一个用于连接到 IMA
  • Python UTF-8转换问题

    在我的数据库中 我存储了一些 UTF 8 字符 例如 名称 字段中的 通过 Django ORM 当我读到这个时 我得到了类似的东西 gt gt gt p name u xce xb1 gt gt gt print p name 我本来希望
  • 在解析之前使用 lxml 注册命名空间

    我正在使用 lxml 从具有命名空间的外部服务解析 XML 但未将它们注册到xmlns 我正在尝试手动注册它register namespace 但这似乎不起作用 from lxml import etree xml
  • highchart情节可以有移动动画吗?

    有没有什么方法可以让情节线通过动画移动到新位置 或者我必须使用其他插件吗 我想构建像二元期权或专家期权游戏一样的乐趣 这是我的简单演示 示例演示链接 http jsfiddle net krdh2e73 function Highchart
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • Python如何拆分列表列表?

    我有一个清单清单 myList 1 2 3 4 5 6 7 8 9 10 我想将其分成三个单独的列表 每个列表都有自己的名称 a 1 2 3 b 4 5 6 c 7 8 9 10 我该怎么做呢 您可以直接解压它 a b c myList
  • 无法解析类型“Microsoft.AspNetCore.Identity.RoleManager”的服务

    我编写代码以在我的 asp net core 项目中向用户添加角色 这是我的角色控制器 public class RolesController Controller RoleManager
  • 如何编写对 UTF-8 安全的代码?

    我们有一组针对 ASCII 字符集开发的应用程序 现在 我们正尝试在冰岛安装它 但遇到了冰岛字符被搞砸的问题 我们正在解决我们的问题 但我想知道 是否有一个好的 指南 来编写专为 8 位字符设计的 C 代码 并且在提供 UTF 8 数据时可