【问题标题】:How to convert string with double high/wide characters to normal string [VC++6]如何将具有双高/双宽字符的字符串转换为普通字符串 [VC++6]
【发布时间】:2011-02-17 05:42:21
【问题描述】:

我的应用程序通常会收到以下格式的字符串:
“ 商品 $5.69 ”

我一直期待的一些内容:
- LENGHT 始终为 20 个字符
- 文本的起始索引始终 [5]
- 最重要的是价格的 DECIMAL 指数始终 [14]
为了正确识别此字符串,我验证了上面列出的所有预期内容 ....

我的一些客户现在已经开始发送带有双倍高/双倍宽值(代表单个可读字符的字符对)的字符串,类似于以下内容: " 项目 $x80x90.x81x91x82x92 "

为了测试,我只是逐个字符地扫描字符串,比较 char[i] 和 char[i+1] 并在找到匹配项时将这些对替换为对应的单个字符(工作正常),如下所示:

[代码]

for (int i=0; i < sData.length(); i++)
{
   char ch = sData[i] & 0xFF;
   char ch2 = sData[i+1] & 0xFF;

   if (ch == '\x80' && ch2 == '\x90')
      zData.replace("\x80\x90", "0");
   else if (ch == '\x81' && ch2 == '\x91')
      zData.replace("\x81\x91", "1");
   else if (ch == '\x82' && ch2 == '\x92')
      zData.replace("\x82\x92", "2");
   ...
   ...
   ...
}

[/代码]

但结果是这样的:
“ 商品 $5.69 ”

请注意,这不再符合我的预期:由于 3 次转换,长度现在是 17(而不是 20),由于之前转换了“5”,小数现在位于索引 13(而不是 14)小数点。

理想情况下,我想将字符串转换为正常的可读格式,将常量(长度、文本索引、小数索引)保持在同一个位置(这样我的应用程序的其余部分就可以重用)......或者任何其他建议(我对此非常坚持)...是否有处理这些类型字符的标准方法?

任何帮助将不胜感激,我已经坚持了一段时间了......

谢谢,

【问题讨论】:

  • 搜索“将宽字符转换为字符”。如果您确实找到了解决方案,请发布它。如果几天没有人找到解决方案,我会尝试写一些东西。
  • 不会使用 WideCharToMultiByte 仍会更改常量(如整体字符串大小、小数点位置等...)?
  • 那是什么鬼代码?他们是把你当作打印机还是什么的?它不是 Unicode。
  • 也许吧,我的假设是这实际上是某种收据数据……但如果不是unicode……那是什么?

标签: c++ string


【解决方案1】:

您需要 Unicode 范式。 This Page 会帮助你,尽管是关于 VS8。 NormalizeString API 独立于使用的 Visual Studio 版本。

【讨论】:

    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    相关资源
    最近更新 更多