- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在编写一个与 mingw 一起使用的包装层,它为应用程序提供了一个虚拟的 UTF-8 环境。处理文件名的函数是从 UTF-8 转换并调用相应的“_w”函数等的包装器。我遇到的最大问题是 Windows 的 wchar_t
是 16 位的。
对于文件系统操作,这没什么大不了的。我可以在 UTF-8 和 UTF-16 之间来回转换,一切正常。但是标准的 C 多字节/宽字符转换 API 不允许多 wchar_t 字符。
可能的解决方案:
wchar_t
替换为 typedef int32_t wchar_t;
并处理 WCHAR
和 wchar_t
不同的。这很痛苦,但它可能是移植需要干净的 POSIX 类型环境并且不将 wchar_t
用于任何 Windows-API 目的的应用程序的理想选择。mbrtowc
读取一个4字节的UTF-8字符的前3个字节后,输出一个高代理对应的wchar_t
,其余状态保存在mbstate_t
对象。收到下一个字节后,它将其与保存的状态结合起来输出低代理项。如果最后一个字节最终无效,它返回 -1(使用 EILSEQ)并且一个单独的代理项最终出现在输出流中(坏...)。
wcrtomb
在处理高代理项时输出 UTF-8 的前 2 个字节,并将剩余状态保存在其 mbstate_t
对象中。当它随后处理低代理项时,它会将其与保存的状态结合起来以输出 UTF-8 的最后 2 个字节。如果未收到有效的低代理项,它会返回 -1(使用 EILSEQ)并且不完整的 UTF-8 序列将在输出流中结束(错误...)。
这个 hack 的优点是只要输入有效,它就可以工作,并且允许访问任何 UTF-8 字符,因此可以访问任何可能的文件名/参数/等。应用程序可能需要处理的文本。
缺点是它不严格符合 ISO C(wchar_t
字符串不允许是有状态的)并且它会延迟对格式错误字符的检测,直到已经写入不正确的部分输出。
我正在寻找有关不同选项的反馈,尤其是我提出的 hack:是否合理,缺点是否可能导致严重错误,以及是否还有其他我尚未考虑的缺点可能会保留从完全工作的计划。我也很乐意听到我没有想到的任何其他可能的解决方案。
最佳答案
我会做类似#4 的事情,但在您确定输入有效之前不要生成任何输出。
mbrtowc
应该解码整个字符。如果它在 BMP 之外,则输出高代理项并将低代理项存储在 mbstate_t
中。wcrtomb
应该在 mbstate_t
中存储高代理项,然后如果字符有效则输出所有 4 个 UTF-8 字节。关于c - 如何最好地处理 Windows 的 16 位 wchar_t 丑陋?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3228828/
kable(head(mtcars) %>% kable_styling(bootstrap_options = c("striped", "hover")) 使用 kable 表(见上文)的普通
我试图很好地显示 NSTextView 中突出显示的段落。现在,我通过创建一个带有背景颜色的 NSAttributedString 来做到这一点。这是一些简化的代码: NSDictionary *at
我的站点位于 http://www.idataresearch.net 我正在为导航菜单使用 Dynamic Drive 的 ddmoothmenu 脚本。我真的很喜欢这个脚本,很高兴看到以前的开发人
我在 Ubuntu EC2 实例上运行 nginx、gunicorn、django。整个网站运行良好。除了管理员。管理员无法正常显示。我运行“python manage.py Collectstati
在一个本身嵌套在一个或多个父数组/结构/union 中的数组/结构/union 中读取多个数字/字符串的最佳方法是什么? 没有临时变量的第一个例子: printf("%d %d\n", a[9][3]
我正在编写一个与 mingw 一起使用的包装层,它为应用程序提供了一个虚拟的 UTF-8 环境。处理文件名的函数是从 UTF-8 转换并调用相应的“_w”函数等的包装器。我遇到的最大问题是 Windo
在我的回答中Clojure For Comprehension example我有一个处理自己输出的函数: (defn stream [seed] (defn helper [slow]
我使用的是 bootstrap 4.0 alpha,没有其他样式。布局非常丑陋,日历只显示一列而不是表格。知道为什么以及如何做吗? 我从网站上注意到以下内容,但我不明白我应该怎么做: note: Th
我是一名优秀的程序员,十分优秀!