如何将Unicode字符转换为转义码

4
所以,我有一堆像这样的字符串:{\b\cf12 よろてそ}。我想遍历每个字符,并用Unicode转义码(\u###)替换任何Unicode(编辑:任何AscW(char) > 127 or < 0), 不过,我不确定如何在程序中实现。有什么建议吗?
澄清一下: 我有一个字符串,像这样:{\b\cf12 よろてそ },我想要一个像这样的字符串:{\b\cf12 [STUFF]},其中[STUFF]将在查看rtf文本时显示为よろてそ。

1
在VB6中,所有的字符串都是Unicode编码。因此,请明确一下,您是否认为不小心将UTF-8编码的内容误读为Unicode编码或OEM页面代码? - AnthonyWJones
还有,你为什么想要这个?你打算如何处理带有这些转义码的字符串? - AnthonyWJones
@Anythony:我需要这个是因为我有一些动态生成的字符串,其中混合了RTF和Unicode,由于RTF是8位格式,无法正确显示。 - Brian
顺便提一下,其中一些字符串实际上是混合了未转义的Unicode和RTF的静态生成字符串。 - Brian
2个回答

3
您可以使用AscW()函数来获取正确的值:-
sRTF = "\u" & CStr(AscW(char))

注意,与其他unicode转义方式不同,RTF使用十进制带符号短整型(2字节)表示unicode字符。这使得在VB6中进行转换非常容易。

编辑

正如MarkJ在评论中指出的那样,您只需要对0-127范围之外的字符进行此操作,但是您还需要对0-127范围内的某些其他字符进行特殊处理。


1
你可以对所有大于 127 的 char 值执行此操作。127 及以下的 chars 在所有代码页中都是相同的,可能不需要更改。 - MarkJ
@MarkJ:同意,我可能应该指出来,这个问题使用的是256,这是错误的。 - AnthonyWJones
2
数字小于0的也需要转换。 - Brian
Unicode码点都是大于0的。如果您将它们作为整数字符处理,则它们将似乎小于0,因为VB6没有16位无符号数据类型。此外,请确保考虑代理对。 - rpetrich
@rpetrich:我们知道代码点没有符号,这就是为什么我在编辑答案时忽略了它。你认为在这种情况下代理对需要特殊处理吗?它们不会被编码成RTF的代理对吗? - AnthonyWJones
显示剩余3条评论

0
另一种更迂回的方法是将MSScript.OCX添加到项目中,并与VBScript的Escape函数进行接口。例如:
Sub main()
    Dim s As String
    s = ChrW$(&H3088) & ChrW$(&H308D) & ChrW$(&H3066) & ChrW$(&H305D)
    Debug.Print MyEscape(s)
End Sub

Function MyEscape(s As String) As String
    Dim scr As Object
    Set scr = CreateObject("MSScriptControl.ScriptControl")
    scr.Language = "VBScript"
    scr.Reset
    MyEscape = scr.eval("escape(" & dq(s) & ")")
End Function

Function dq(s)
    dq = Chr$(34) & s & Chr$(34)
End Function

主程序传入原始的日语字符,调试输出显示:
%u3088%u308D%u3066%u305D

HTH


请注意,MS Script Control 在 Vista 上不受支持。 - MarkJ
“不支持”是指“不能工作”还是“如果出现故障或破坏操作系统,没有人会帮我”? - bugmagnet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接