Delphi中泰语UTF-8编码字符串的实际长度

时间:2017-10-05 04:59:27

标签: delphi utf-8 thai

泰语是一种非常特殊的语言。您可以在辅音之后,或者在它的前面,或者它的顶部,或者在它的底部写任何其他语言的元音(总共 32 )(好吧,只是短片)并且长“u”的声音可以在底部,但无论如何......)。

此外,还有其他修饰符(4种音调标记,ga-ran,mai-tai-ku和其他修饰符)可以在已存在的元音上发挥作用!

例如:

 ที่ดีที่สุด (the best)

正如您所看到的,如果我尝试使用等宽字体打印它,“实际长度”将是5个字符,但所有UTF-8 strlen例程都会返回11个字符 - 这是完全正确的,但是当打印等宽字体时,我需要知道字符串在屏幕/打印机上使用的“实际空间”。

当然,一个简单的解决方案是列出可以放在单词顶部或底部的所有特殊字符,并将其从总计数中删除。

由于我不确定我能找到所有特殊字符,是否已经有用任何语言编写的例程,以便我可以在Delphi中翻译它?

谢谢

1 个答案:

答案 0 :(得分:1)

在C ++中:

    /*---------------------------------------------------------------------------*/
    /*                              thai_tcslen                                  */
    /*---------------------------------------------------------------------------*/
    short thai_tcslen(_TCHAR *buff)
    {
      short bufpos;
      short normal_length;
      short thai_length;

      thai_length=0;
      normal_length = _tcslen(buff);
      for (bufpos = 0; bufpos < normal_length; bufpos++) {
        if (   *(buff+bufpos) != _T('Ñ')/*mai han na kaad*//*-047*/
            && *(buff+bufpos) != _T('Ô')/*sara ee        *//*-044*/
            && *(buff+bufpos) != _T('Õ')/*sara eeeee     *//*-043*/
            && *(buff+bufpos) != _T('Ö')/*sara uu        *//*-042*/
            && *(buff+bufpos) != _T('×')/*sara uuuuu     *//*-041*/
            && *(buff+bufpos) != _T('Ø')/*sara oo        *//*-040*/
            && *(buff+bufpos) != _T('Ù')/*sara ooooo     *//*-039*/
            && *(buff+bufpos) != _T('ç')/*mai tai khoo   *//*-025*/
            && *(buff+bufpos) != _T('è')/*mai aek        *//*-024*/
            && *(buff+bufpos) != _T('é')/*mai toe        *//*-023*/
            && *(buff+bufpos) != _T('ê')/*mai cha ta wah *//*-022*/
            && *(buff+bufpos) != _T('ë')/*mai tree       *//*-021*/
            && *(buff+bufpos) != _T('ì')/*ka ran         *//*-020*/
            ) {
          thai_length++;
        }
      }

      return(thai_length);
    } /* thai_tcslen */

在VB6中:

    Public Function ThaiStringLength(ByRef ThaiString As String) As Long
      Dim b As String, noLengthChars(13) As Byte
      b = ThaiString

      noLengthChars(0) = 209
      noLengthChars(1) = 212
      noLengthChars(2) = 213
      noLengthChars(3) = 214
      noLengthChars(4) = 215
      noLengthChars(5) = 216
      noLengthChars(6) = 217
      noLengthChars(7) = 231
      noLengthChars(8) = 232
      noLengthChars(9) = 233
      noLengthChars(10) = 234
      noLengthChars(11) = 235
      noLengthChars(12) = 236

      Dim o As Long
      For o = 0 To 12
        If InStr(b, Chr(noLengthChars(o))) > 0 Then
          b = Replace(b, Chr(noLengthChars(o)), "")
        End If
      Next
      ThaiStringLength = Len(b)
    End Function