Ниже приведен код VBScript, который я использую в ASP Classic.
Как вы заметите, здесь нет объявлений типов, все варианты.
То, что я намеревался сделать с этим, имело функции ChrU
и AscU
, поддерживающие символы вне UCS-2 (Базовая многоязычная плоскость).
Поскольку это написано в первую очередь для VBScript, я думаю, что он не зависит от хоста. У меня его нет, но он должен работать и на MAC. Надеюсь, это поможет.
![AscU and ChrU in VBx](https://i.stack.imgur.com/3yc6Y.png)
Private Function RightShift(ByVal pVal, shift)
Dim i, nVal
For i = 1 To shift
nVal = (pVal And &H7FFFFFFF) \ 2
If nVal And &H80000000 Then nVal = nVal Or &HC0000000
pVal = nVal
Next
RightShift = pVal
End Function
Private Function LeftShift(ByVal pVal, shift)
Dim i, nVal
For i = 1 To shift
nVal = (pVal And &H3FFFFFFF) * 2
If pVal And &H40000000 Then
nVal = nVal Or &H80000000
End If
pVal = nVal
Next
LeftShift = nVal
End Function
Public Function ChrU(ByVal code)
Dim lo, hi ' to hold 16-bit surrogate pairs
code = Int(code)
If code <= 65535 Then
' code is in the UCS-2 range (a.k.a. Basic Multilingual Plane) which ChrW (and AscW) relies on.
' falling back to ChrW
ChrU = ChrW(code)
ElseIf code <= 1114111 Then ' code is in the Unicode range beyond UCS-2
code = code - &H10000
lo = ChrW(&HD800& Or RightShift(code, 10))
hi = ChrW(&HDC00& Or (code And &H3FF))
ChrU = Join(Array(lo, hi), "")
Else
Err.Raise 9, "ChrU", "Code point was out of range."
End If
End Function
Public Function AscU(str)
Dim lo, hi ' to hold 16-bit surrogate pairs
If Len(str) = 1 Then
AscU = AscW(str) And &HFFFF&
Else
Dim txt
txt = Left(str, 2)
lo = AscW(Mid(txt, 1, 1)) And &HFFFF&
hi = AscW(Mid(txt, 2, 1)) And &HFFFF&
If &HDC00& > hi Or hi > &HDFFF& Then
' hi surrogate is not valid
' assuming "str" is a Unicode (UCS-2) string of at least 2 characters
' returning first character's codepoint
' as Asc and AscW do
AscU = lo
Exit Function
End If
AscU = &H10000 + LeftShift(lo And &H3FF, 10) + (hi And &H3FF)
End If
End Function