Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从右到左隔离字符串。C++;_C++_Unicode_Farsi - Fatal编程技术网

C++ 从右到左隔离字符串。C++;

C++ 从右到左隔离字符串。C++;,c++,unicode,farsi,C++,Unicode,Farsi,有人有Unicodes的经验吗 我面临着波斯语独角兽的棘手问题。 我有一个std::wstring s=(L“\u0634\u0646\u0628\u0647”)这是一个波斯语单词。当我调试它时,我看到底层的单词正是我想要的,但是相反。因此,我研究发现u2067用于从右向左读取字符串。 注: 我无法手动反转字符串,因为波斯语字符正在改变其形状,而不管它们在字符串中的位置如何 因此,我在开头添加了2067 int,得到了 std::wstring s=(L“\u2067\u0634\u0646\u

有人有Unicodes的经验吗

我面临着波斯语独角兽的棘手问题。
我有一个
std::wstring s=(L“\u0634\u0646\u0628\u0647”)这是一个波斯语单词。当我调试它时,我看到底层的单词正是我想要的,但是相反。因此,我研究发现u2067用于从右向左读取字符串。
注:

我无法手动反转字符串,因为波斯语字符正在改变其形状,而不管它们在字符串中的位置如何

因此,我在开头添加了2067 int,得到了
std::wstring s=(L“\u2067\u0634\u0646\u0628\u0647”)
但现在基础字符串是相同的,只要在字符串开头添加一个正方形,而不是反转。

有人有这方面的经验吗?请提出解决办法。谢谢

基础字符串将是相同的。您没有更改字节的顺序,这是在代码中写的。但是理解Unicode的渲染器应该使用这些字节并从右向左显示字符。那是视觉上的东西。这与编码无关。从你的问题来看,还不完全清楚你还期望什么。可能是您正在调试器中查看字符串,而调试器不支持Unicode的此功能。如果您尝试将字符串输出到适当的控制台,您应该会看到预期的结果。

基础字符串将是相同的。您没有更改字节的顺序,这是在代码中写的。但是理解Unicode的渲染器应该使用这些字节并从右向左显示字符。那是视觉上的东西。这与编码无关。从你的问题来看,还不完全清楚你还期望什么。可能是您正在调试器中查看字符串,而调试器不支持Unicode的此功能。如果您尝试将字符串输出到一个适当的控制台,您应该会像预期的那样看到它。

这只是调试器中的问题吗?该字符串当然有4个字符,第一个是\u0634。RTL只是一个Unicode输出系统的指令,它应该在右边呈现第一个字符,然后在左边呈现。如果调试器单独呈现每个字符,这对您没有帮助。RTL呈现依赖于处理整个字符串的文本呈现程序。这在Visual Studio 17调试器、Windows 10
OutputDebugString(L“\u0634\u0646\u0628\u0647\n”)
中运行良好。输出应该是
L“u1588نبه”
-它显示时在右侧出现
\u0634
。@BarmakShemirani有趣,我不知道它怎么知道要这么做。可能它(或底层Windows API)检查字符串的内容。@PaulSanders是的,Windows draw函数知道代码点是否从左到右开始,或者是否有其他拉丁字符中不存在的奇怪属性。这也在
ScriptString
DirectWrite
中公开,供有足够勇气直接解决的人使用。@BarmakShemirani好的,谢谢。我想一定是这样。这只是为了说明Windows并不是许多人所说的那个完完全全的傻瓜。这只是调试器中的一个问题吗?该字符串当然有4个字符,第一个是\u0634。RTL只是一个Unicode输出系统的指令,它应该在右边呈现第一个字符,然后在左边呈现。如果调试器单独呈现每个字符,这对您没有帮助。RTL呈现依赖于处理整个字符串的文本呈现程序。这在Visual Studio 17调试器、Windows 10
OutputDebugString(L“\u0634\u0646\u0628\u0647\n”)
中运行良好。输出应该是
L“u1588نبه”
-它显示时在右侧出现
\u0634
。@BarmakShemirani有趣,我不知道它怎么知道要这么做。可能它(或底层Windows API)检查字符串的内容。@PaulSanders是的,Windows draw函数知道代码点是否从左到右开始,或者是否有其他拉丁字符中不存在的奇怪属性。这也在
ScriptString
DirectWrite
中公开,供有足够勇气直接解决的人使用。@BarmakShemirani好的,谢谢。我想一定是这样。这表明Windows并不像许多人想象的那样是一个完整的瓦罐。