none
如何以 VBS 辨別一個字串的長度 (Bytes)? RRS feed

  • 問題

  • 各位好:

    若有 "中文123" 的字串給 VBS 使用,當使用 len() 時,回傳為 5, 使用 lenb() 時,回傳為 10。

    請問這要怎樣才能得到 7 的數字?

     

    小弟目前使用 Len 取得幾個字, 然後使用 Mid 一個一個取出來, 用 Asc() 去看轉出來的值是多少。Code 如下:

    Code Snippet

    Function LenX(xString)
     Dim xLength, i
     xLength = Len(xString)
     LenX = 0
     If xLength = 0 Then
      LenX = 0
     Else
      For i = 1 To xLength
       If 0 <= Asc(Mid(xString, i, 1)) And Asc(Mid(xString, i, 1)) <= 127 Then
        LenX = LenX + 1
       Else
        LenX = LenX + 2
       End If
      Next
     End If
    End Function

     

    但是這個只有對 繁體中文 有效。如果我輸入一些延伸字,比如說「幒」,這個字拿給 Asc() 處理後,是 63,因此判斷成英文...

    請問該怎樣做,才能正確判斷出「繁簡英」混合的字串呢?

    2007年5月23日 上午 05:31

解答

  • 基本上這個對日韓繁簡罕都有效。但是你要確定你的 幒 怎樣來的,因為 63 是 ? ,表示在字串記憶體內被當成 ? 了。

     

    若你用 FSO 讀出來的,FSO 本身只允許當地語系的 ANSI 編碼 (也就是說 big5 / gb 只能有一個) ,所以會被當亂碼,在繁體中文視窗下,可以裝 Unicode 補完計畫,由於增加 5 千多個字對應到 Unicode ,常用的日韓簡罕都在範圍內。

    2007年5月23日 上午 06:14
    版主
  • 感謝您。

    我和朋友討論作法後,發現大多這種延伸字,都是 63。因此,我們把 63 分離出來,另外以字串的型態比對他是不是 = "?" 這樣來判斷。希望不會有其他例外才好。

    至於「幒」這個字是怎麼來的?我的 Windows XP 是英文版,切換成繁中語系。使用自然輸入法,選 Unicode 輸出的字所得到的。

    事實上,以下這些字也是會被 Asc() 傳出 63 ...

    「徸」、「螡」、「箣」、「眡」  -> 讀音就是「中文測試」

    至於我朋友,他說他是從 IE 看簡中網頁,Copy 字進去測試的。

     

    至於 Code 的部分,現在修改如下,供參考。

    Code Snippet

    Function LenX(xString)
     Dim xLength, T_String, i
     xLength = Len(xString)
     LenX = 0
     If xLength = 0 Then
      LenX = 0
     Else
      For i = 1 To xLength
       T_String = Mid(xString, i, 1)
       If 0 <= Asc(T_String) And Asc(T_String) <= 127 And Asc(T_String) <> 63 Then
        LenX = LenX + 1
       ElseIf Asc(T_String) <> 63 Then
        If T_String = "?" Then
         LenX = LenX + 1
        Else
         LenX = LenX + 2
        End If
       Else
        LenX = LenX + 2
       End If
      Next
     End If
    End Function

     

    2007年5月23日 上午 07:32
  • 補充:

    Unicode 要用 AscW 判讀。

    ANSI 才用 Asc 判讀。

    2007年5月23日 上午 08:30
    版主
  • 雖然幾乎不太可能出現 128 ~ 255 的,不過事實上要大於 255 ,小於 0 的,才是 WChar (DWord)
    2007年6月2日 上午 09:29
    版主

所有回覆

  • 基本上這個對日韓繁簡罕都有效。但是你要確定你的 幒 怎樣來的,因為 63 是 ? ,表示在字串記憶體內被當成 ? 了。

     

    若你用 FSO 讀出來的,FSO 本身只允許當地語系的 ANSI 編碼 (也就是說 big5 / gb 只能有一個) ,所以會被當亂碼,在繁體中文視窗下,可以裝 Unicode 補完計畫,由於增加 5 千多個字對應到 Unicode ,常用的日韓簡罕都在範圍內。

    2007年5月23日 上午 06:14
    版主
  • 感謝您。

    我和朋友討論作法後,發現大多這種延伸字,都是 63。因此,我們把 63 分離出來,另外以字串的型態比對他是不是 = "?" 這樣來判斷。希望不會有其他例外才好。

    至於「幒」這個字是怎麼來的?我的 Windows XP 是英文版,切換成繁中語系。使用自然輸入法,選 Unicode 輸出的字所得到的。

    事實上,以下這些字也是會被 Asc() 傳出 63 ...

    「徸」、「螡」、「箣」、「眡」  -> 讀音就是「中文測試」

    至於我朋友,他說他是從 IE 看簡中網頁,Copy 字進去測試的。

     

    至於 Code 的部分,現在修改如下,供參考。

    Code Snippet

    Function LenX(xString)
     Dim xLength, T_String, i
     xLength = Len(xString)
     LenX = 0
     If xLength = 0 Then
      LenX = 0
     Else
      For i = 1 To xLength
       T_String = Mid(xString, i, 1)
       If 0 <= Asc(T_String) And Asc(T_String) <= 127 And Asc(T_String) <> 63 Then
        LenX = LenX + 1
       ElseIf Asc(T_String) <> 63 Then
        If T_String = "?" Then
         LenX = LenX + 1
        Else
         LenX = LenX + 2
        End If
       Else
        LenX = LenX + 2
       End If
      Next
     End If
    End Function

     

    2007年5月23日 上午 07:32
  • 補充:

    Unicode 要用 AscW 判讀。

    ANSI 才用 Asc 判讀。

    2007年5月23日 上午 08:30
    版主
  • 咦!這個 AscW 真是太好用了。我剛剛試了一下,中文字都超過 10000 或是 -10000

    所以,您看看我這樣解釋是否正確:

    只要轉換出來的 Integer 不在 0~127 的範圍內,就可以判斷成是 Double Byte Word?

    2007年6月2日 上午 03:00
  • 雖然幾乎不太可能出現 128 ~ 255 的,不過事實上要大於 255 ,小於 0 的,才是 WChar (DWord)
    2007年6月2日 上午 09:29
    版主