Unicode、_stprintf()和混合文本方向 我正在重构一些传统的C++代码来支持Unicode,当使用一个格式为“t”的字符串(“%s%s”)时,我遇到了问题,参数是:阿拉伯文文本(右到左),后面是字符数组中存储的一些数字。以下是一段代码片段: auto buf = std::make_unique<TCHAR>(); TCHAR Text[]{_T("حبيبيحبيبيحبيب")}; TCHAR Number[]{_T("12345678h90")}; _stprintf(buf.get(), _T("%s %s"), Text, Number); auto-buf=std::make_unique(); TCHAR文本[]{u T(“حب㶑㶑㶑㶑㶑”); TCHAR编号【】{(“12345678h90”)}; _stprintf(buf.get(),_T(“%s%s”),文本,数字);

Unicode、_stprintf()和混合文本方向 我正在重构一些传统的C++代码来支持Unicode,当使用一个格式为“t”的字符串(“%s%s”)时,我遇到了问题,参数是:阿拉伯文文本(右到左),后面是字符数组中存储的一些数字。以下是一段代码片段: auto buf = std::make_unique<TCHAR>(); TCHAR Text[]{_T("حبيبيحبيبيحبيب")}; TCHAR Number[]{_T("12345678h90")}; _stprintf(buf.get(), _T("%s %s"), Text, Number); auto-buf=std::make_unique(); TCHAR文本[]{u T(“حب㶑㶑㶑㶑㶑”); TCHAR编号【】{(“12345678h90”)}; _stprintf(buf.get(),_T(“%s%s”),文本,数字);,c++,winapi,unicode,printf,bidi,C++,Winapi,Unicode,Printf,Bidi,我在buf中得到的是,但我想得到的是文本数组的内容,后面是数字数组的内容。(我试图将它粘贴到这里,但它以与_stprintf相同的方式自动格式化…) 我知道这是因为阿拉伯语文本是强字符类型,所有数字都是弱字符类型,我有一个相对简单的解决方案-重载stprintf,检查参数字符串是否以数字开头,并在U+200E(\u200E)控制字符前加前缀。然而,我忍不住想,也许有一个更简单的解决方案,我不知道像一个全球性的设置或什么?有这样的事吗 这些字符串正在传递给SetWindowText,并且由于阿拉伯

我在buf中得到的是,但我想得到的是文本数组的内容,后面是数字数组的内容。(我试图将它粘贴到这里,但它以与_stprintf相同的方式自动格式化…)

我知道这是因为阿拉伯语文本是强字符类型,所有数字都是弱字符类型,我有一个相对简单的解决方案-重载stprintf,检查参数字符串是否以数字开头,并在U+200E(\u200E)控制字符前加前缀。然而,我忍不住想,也许有一个更简单的解决方案,我不知道像一个全球性的设置或什么?有这样的事吗


这些字符串正在传递给SetWindowText,并且由于阿拉伯语的原因而以错误的顺序显示。我的主要目标是让它们在UI中正确呈现。

为什么不能始终使用
\u t(“%s\x200E%s”)的格式字符串
?它将简单地保证第二个(数字)字段位于第一个(文本)字段的右侧,而不管文本是否为RTL。顺便说一句,您的缓冲区的顺序与您期望的完全一致。我真的不想更改格式字符串,因为这意味着要遍历代码中的所有_stprintf调用(大约有10k个)。不过,你评论的最后一部分真的很有帮助!这些字符串正在传递给SetWindowText,并且由于阿拉伯语的原因而以错误的顺序显示。我的主要目标是让它们在UI中正确呈现。有什么线索可以告诉我如何做到这一点吗?对于渲染大约10000个不同格式的字符串(其中一些可能包含或可能不包含阿拉伯文本片段),通用的“正确”方法是什么?现在的输出是Windows尽最大努力以有意义的方式呈现此文本的结果。你需要一个非常清晰的规范来提供更好的东西。也许,只有少数格式字符串需要修改?当您将字符串传递给Windows时,原来是两个字符串粘在一起的事实已经丢失。Windows根据Unicode双向算法显示字符串,Unicode双向算法将数字放在可视左侧,因为数字的方向性较弱。如果希望它以其他方式显示,则需要调整传入的字符串。不确定您正在寻找的其他解决方案。为什么不能始终使用
\u t(“%s\x200E%s”)
的格式字符串?它将简单地保证第二个(数字)字段位于第一个(文本)字段的右侧,而不管文本是否为RTL。顺便说一句,您的缓冲区的顺序与您期望的完全一致。我真的不想更改格式字符串,因为这意味着要遍历代码中的所有_stprintf调用(大约有10k个)。不过,你评论的最后一部分真的很有帮助!这些字符串正在传递给SetWindowText,并且由于阿拉伯语的原因而以错误的顺序显示。我的主要目标是让它们在UI中正确呈现。有什么线索可以告诉我如何做到这一点吗?对于渲染大约10000个不同格式的字符串(其中一些可能包含或可能不包含阿拉伯文本片段),通用的“正确”方法是什么?现在的输出是Windows尽最大努力以有意义的方式呈现此文本的结果。你需要一个非常清晰的规范来提供更好的东西。也许,只有少数格式字符串需要修改?当您将字符串传递给Windows时,原来是两个字符串粘在一起的事实已经丢失。Windows根据Unicode双向算法显示字符串,Unicode双向算法将数字放在可视左侧,因为数字的方向性较弱。如果希望它以其他方式显示,则需要调整传入的字符串。不确定您正在寻找的其他解决方案。