【问题标题】:Thai string manipulation issues caused by incorrect string length字符串长度不正确导致的泰语字符串操作问题
【发布时间】:2015-04-30 23:35:51
【问题描述】:

我正在尝试突出显示泰语文本中的一些子字符串:

high = high.Insert(myString.Index + myString.Length + "<b>" + currentLength, "</b>");

问题是,myString 字符串包含一个特殊的泰语字符(“เงินฝาก”)。给定字符串的长度应为 7,但长度被解析为 6。它仅部分突出显示文本,不包括最后一个字符。

我已经尝试对字符串进行编码(包括高字符串和myString 字符串)。但它没有用。您对如何处理此问题有任何提示吗?我也尝试过Replace 方法,但无济于事。

提前致谢!

【问题讨论】:

  • 我用เงินฝาก 测试了String.Length,它返回7,而不是6
  • 嗨,谢谢调查。有可能,当我将字符串复制到编辑器中时,它会切碎字符。这是我在调试模式下的代码截图:link 注意观察变量
  • 如何计算长度?我看不懂泰语,但在我的浏览器中一次选择一个字形,我会在你的字符串中计算六个字形。里面有组合字符吗?
  • 我也看不懂泰语,所以我在同一页上。看起来第一个字符是一个组合字符。在另一个编辑器中打开它时,我可以看到我的光标卡在第一个字符的中间:link。我还尝试将线程设置为 InvariantCulture,但没有帮助。线程文化设置为泰语。
  • 好的,所以看起来这两个字符串的编码方式不同。这是逐个字符比较的屏幕截图,显然,第三个字符是相同的:character compare

标签: c# string encoding utf-8 thai


【解决方案1】:

简单的概念是忽略上标和下标泰语字符的计数,如下面的示例代码:

    public int ThaiLength(string text)
    {
        int c = 0;
        int l = text.Length;

        for (int i = 0; i < l; ++i)
        {
            if (char.GetUnicodeCategory(text[i]) != System.Globalization.UnicodeCategory.NonSpacingMark)
                ++c;
        }

        return c;
    }

【讨论】:

  • -1,抱歉:(1) 代码看起来像是公然的 hack; (2) 正确的方法应该使用char.GetUnicodeCategory(),而不是硬编码的东西; (3)即使是手动计数,调用text.ToCharArray().Length一次就够了,不需要循环; (4) 还有,在循环中调用ToCharArray() 是非常无效的。
  • 非常好!! char.GetUnicodeCategory() 可用于检查计数长度,而不是硬编码文本字符串。
猜你喜欢
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多