将字符转换为大写阿拉伯语

安德鲁·特拉克(Andrew Truckle)

我有以下代码将字母转换为大写:

// make this character upper
if(_istalpha(zChar) && !_istupper(zChar))
   pMsg->wParam = (WPARAM)_toupper(zChar);

它已经工作了多年。最近,有人要求我支持阿拉伯语,而我的用户说信件已经损坏。这是因为上面的代码。

阿拉伯语告诉我,大写字母不适用。我知道我可以测试我的程序设置,以查看它们是否使用阿拉伯语,并避免使用此代码。但是还有另一种方法吗?

例如,我知道您_tsetlocale首先打来的日期

更新:

找到了有关toupper的主题,其中提到了语言环境设置!会尝试的。

科迪·格雷

正如您所发现的那样,经典的转换例程(例如CRTtoupper和Win32)CharUpper相当愚蠢。它们通常从假定全世界都是ASCII的时间开始欢呼。

您需要的是对语言敏感的转换。这是一种计算上更昂贵的操作,同时也非常难以正确实现。语言很难。因此,您希望将责任尽可能转移到标准库中。由于使用的是MFC,显然您的目标是Windows操作系统,这意味着您很幸运。您可以背负Microsoft本地化工程师的辛勤工作,从而获得与外壳和其他OS组件一致的额外好处。

您需要调用的函数是LCMapStringEx(或者LCMapString如果您仍以Vista之前的平台为目标)。该函数签名的复杂性充分证明了正确的语言感知字符串处理这一复杂任务。

  • 首先,您需要选择一个语言环境。通常,需要用户的默认语言环境,LOCALE_NAME_USER_DEFAULT可以使用进行指定,但是您可以在此处使用任何内容。
  • 对于标志,您将需要LCMAP_UPPERCASE | LCMAP_LINGUISTIC_CASING要执行相反的操作,请使用LCMAP_LOWERCASE | LCMAP_LINGUISTIC_CASING这里也要记住许多其他有趣而有用的选项。
  • 然后,您有一个指向源字符串的指针,它的长度以字符(代码单位)为单位。
  • 还有一个指向接收结果的字符串缓冲区的指针,以及以字符(代码单位)为单位的最大长度。
  • 最后三个参数可以简单地设置为NULL或0。

放在一起:

BOOL ConvertToUppercase(std::wstring& buffer)
{
    return LCMapStringEx(LOCALE_NAME_USER_DEFAULT  /* or whatever locale you want */,
                         LCMAP_UPPERCASE | LCMAP_LINGUISTIC_CASING,
                         buffer.c_str(),
                         buffer.length(),
                         &buffer[0],
                         buffer.length(),
                         NULL,
                         NULL,
                         0);
}

请注意,我在这里对缓冲区的内容进行就地转换,因此假设大写字符串的长度与原始输入字符串的长度完全相同。可能是正确的,但可能不是一个普遍安全的假设,因此您将要添加针对此类错误(ERROR_INSUFFICIENT_BUFFER)的处理,和/或防御性地向缓冲区添加一些额外的填充。

如果您希望像现在一样使用CRT功能,_totupper_l并且它的朋友是LCMapString/的包装LCMapStringEx请注意_l后缀,该后缀表示这些是语言环境感知的转换函数。它们允许您传递显式语言环境,该语言环境将在转换中使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WordPress将英语转换为阿拉伯语

来自分类Dev

仅将指定的div的英语数字转换为波斯语/阿拉伯语

来自分类Dev

将一种印地语数字转换为阿拉伯语数字

来自分类Dev

将SQL Server文本从法语转换为阿拉伯语

来自分类Dev

将 asp.net 网站从英语转换为阿拉伯语

来自分类Dev

将字符串yyyy-MM-dd转换为日期格式,电话语言从右到左(阿拉伯语)

来自分类Dev

无法将wpf中的数据网格转换为csv而不会丢失阿拉伯语值

来自分类Dev

角度数字管道会将数字转换为阿拉伯语吗?

来自分类Dev

阿拉伯语PDF格式转换为PHP至MYSQL,Unicode解码?

来自分类Dev

如何在oracle中选择数字并将数字从英语转换为阿拉伯语

来自分类Dev

分割草书字符(阿拉伯语OCR)

来自分类Dev

检测阿拉伯语标记中的重复字符

来自分类Dev

PHP删除Unicode阿拉伯语字符

来自分类Dev

iOS阿拉伯语Pushnotification

来自分类Dev

iOS阿拉伯语Pushnotification

来自分类Dev

笔尖镜像阿拉伯语

来自分类Dev

Redis阿拉伯语解码

来自分类Dev

Stimulsoft报告richText错误中的Unicode字符(阿拉伯语或波斯语)

来自分类Dev

使用阿拉伯语月份的JavaScript中的日期转换和操作

来自分类Dev

字符串从右到左的语言替换(阿拉伯语)

来自分类Dev

字符串从右到左的语言替换(阿拉伯语)

来自分类Dev

无法发送具有良好字符的阿拉伯语电子邮件

来自分类Dev

从pdf中提取阿拉伯语到字符串c#

来自分类Dev

在数据库中保存字符串的阿拉伯语列表

来自分类Dev

如何正确地将阿拉伯语脚本插入Tkinter文本小部件?

来自分类Dev

Cakephp:如何将阿拉伯语单词保存到mysql表中?

来自分类Dev

将GWT国际化为阿拉伯语(RTL语言)?

来自分类Dev

无法使用Python将阿拉伯语解码的Unicode保存到CSV文件

来自分类Dev

jinja 2将阿拉伯语传递给rander模板

Related 相关文章

  1. 1

    WordPress将英语转换为阿拉伯语

  2. 2

    仅将指定的div的英语数字转换为波斯语/阿拉伯语

  3. 3

    将一种印地语数字转换为阿拉伯语数字

  4. 4

    将SQL Server文本从法语转换为阿拉伯语

  5. 5

    将 asp.net 网站从英语转换为阿拉伯语

  6. 6

    将字符串yyyy-MM-dd转换为日期格式,电话语言从右到左(阿拉伯语)

  7. 7

    无法将wpf中的数据网格转换为csv而不会丢失阿拉伯语值

  8. 8

    角度数字管道会将数字转换为阿拉伯语吗?

  9. 9

    阿拉伯语PDF格式转换为PHP至MYSQL,Unicode解码?

  10. 10

    如何在oracle中选择数字并将数字从英语转换为阿拉伯语

  11. 11

    分割草书字符(阿拉伯语OCR)

  12. 12

    检测阿拉伯语标记中的重复字符

  13. 13

    PHP删除Unicode阿拉伯语字符

  14. 14

    iOS阿拉伯语Pushnotification

  15. 15

    iOS阿拉伯语Pushnotification

  16. 16

    笔尖镜像阿拉伯语

  17. 17

    Redis阿拉伯语解码

  18. 18

    Stimulsoft报告richText错误中的Unicode字符(阿拉伯语或波斯语)

  19. 19

    使用阿拉伯语月份的JavaScript中的日期转换和操作

  20. 20

    字符串从右到左的语言替换(阿拉伯语)

  21. 21

    字符串从右到左的语言替换(阿拉伯语)

  22. 22

    无法发送具有良好字符的阿拉伯语电子邮件

  23. 23

    从pdf中提取阿拉伯语到字符串c#

  24. 24

    在数据库中保存字符串的阿拉伯语列表

  25. 25

    如何正确地将阿拉伯语脚本插入Tkinter文本小部件?

  26. 26

    Cakephp:如何将阿拉伯语单词保存到mysql表中?

  27. 27

    将GWT国际化为阿拉伯语(RTL语言)?

  28. 28

    无法使用Python将阿拉伯语解码的Unicode保存到CSV文件

  29. 29

    jinja 2将阿拉伯语传递给rander模板

热门标签

归档