4

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

此外,还有其他修饰语(4 个声调标记、ga-ran、mai-tai-ku 和其他修饰语)可以在已经存在的元音之上!

例如:

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

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

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

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

谢谢

4

1 回答 1

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
于 2020-06-24T08:19:06.797 回答