3

我在 MS Access 2003 中有一个表字段,其中包含这样的 HTML 编码字符串:

Ανταγωνισμός παγκοσμίου επιπέδου στην κατάρτι&#963

如何使用 MS Access 将其解码为“普通字符串”?

提前致谢。


这是我到目前为止所拥有的。使用此处提供的 Vb 代码(顺便说一句,我只能从 IE7 打开该页面,不能从 FF 3.5 或 Chrome 2 打开),我编写了以下函数:

Private Function UnicodeDecode(StringToDecode As String) As String
  Dim TempAns As String
  Dim CurChr As Integer
  CurChr = 1
  Do Until CurChr - 1 = Len(StringToDecode)
    Select Case Mid(StringToDecode, CurChr, 2)
    Case "&#"
      TempAns = TempAns & Chr(Mid(StringToDecode, CurChr + 2, 3))
       CurChr = CurChr + 5
    Case Else
      TempAns = TempAns & Mid(StringToDecode, CurChr, 1)
    End Select
    CurChr = CurChr + 1
  Loop
  UnicodeDecode = TempAns
End Function

现在,当您提供高达 255 的字符的十进制值时,这将起作用。如果我尝试执行,例如:

Chr(338)

它因“无效的过程调用或参数”而失败。根据这个参考,我想 MS Access 默认只支持 ISOlat1 标准。但是,我需要转换十进制值大于 913 的 unicode 字符,即 ISOgrk3。

有谁知道我怎样才能做到这一点?

再次感谢。

4

6 回答 6

4

您可以使用 msxml6.dll (Microsoft XML v6.0) 将 html 实体转换为 VBA 中的纯文本:

Set oDOMDoc = CreateObject("Msxml2.DOMDocument.6.0")
Html = "<Black>"2"
oDOMDoc.LoadXML ("<root>" & Html & "</root>")
HtmlDecode = oDOMDoc.Text
于 2012-10-10T17:48:45.107 回答
2

非常感谢。如果输入数组有4位数字(如波斯语),我必须更改一些代码,当您想在 MS Access 中将其用作宏时,该函数也应该是公共的。应用ChrW()而不是 Chr()。

Public Function UnicodeDecode(StringToDecode As String) As String
  Dim TempAns As String
  Dim CurChr As Integer
  CurChr = 1
  Do Until CurChr - 1 = Len(StringToDecode)
    Select Case Mid(StringToDecode, CurChr, 2)
    Case "&#"
      TempAns = TempAns & ChrW(Mid(StringToDecode, CurChr + 2, 4))
       CurChr = CurChr + 6
    Case Else
      TempAns = TempAns & Mid(StringToDecode, CurChr, 1)
    End Select
    CurChr = CurChr + 1
  Loop
  UnicodeDecode = TempAns
End Function
于 2010-03-13T23:12:08.123 回答
1

这是一篇文章,建议了您可能会进入的一些方向:

在 Visual Basic 6 中使用 Unicode(Access 的 VBA 是 VB6 的超集)

然后你可能会想弄乱这些 Access/VBA 函数:

  • StrConv()
  • AscB()
  • ChrB()

这并不能解决所有问题,但这应该给你一个起点。

注意 StrConv() 的第二个参数 vbUnicode 和 vbFromUnicode 的两个常量,最后一个可选参数是字符集,对于希腊语,它在上面引用为 161 的 URL 中给出(似乎没有命名常量——dbLangGreek 常量返回“;LANGID=0x0408;CP=1253;COUNTRY=0”)。

我突然想到,只要您对此仅限于希腊语,您可能只需要设置一个将字符映射到其相应数字编码的数组。但我认为使用处理多个编码的解决方案会更好。

最后,您可以尝试访问 Michael Kaplan 旧网站 Trigeminal.com 上的此页面:

Trigeminal Software, Inc. 的本地化网站

...并向下滚动到最后,“此站点上的其他 I18n 资源。” 对于 .NET 和其他编程来说,大部分信息已经过时,但它仍将适用于 VB6/Access VBA。

于 2009-09-08T18:57:21.550 回答
0

我知道这是一个旧线程,但一直在寻找更好的捕鼠器......

Public Function HtmlDecode(StringToDecode As Variant) As String
    Set oMSHTML = CreateObject("htmlfile")
    Set e = oMSHTML.createElement("T")
    e.innerHTML = StringToDecode
    HtmlDecode = e.innerText
End Function
于 2020-09-03T04:40:27.060 回答
0

偶然发现这篇文章来解码嵌入在 xml 元素中的“html 编码的 xml”。@David-W-Fenton 目前接受的答案是关于 url 解码,它既不能解决问题,也不能解决我的问题。@Ruslan 的答案在将 html 实体混入其中时存在问题(如 @Roemer 所述)。在这里,我有一个带有 unicode 控制代码和 html 实体的工作示例,它解决了这些问题并(im)证明了@Tx-Barnstormer 给出的答案:

Public Sub TestDecoding()
    Dim htmlEncoded As String
    Dim xmlDoc As Object
    
    htmlEncoded = "&lt;tests&gt;" & _
        "&lt;eacute&gt;&eacute;&lt;/eacute&gt;" & _
        "&lt;amp&gt;&amp;amp;&lt;/amp&gt;" & _
        "&lt;childNode&gt;&lt;childNode attribute=&quot;testvalue&quot;&gt;I&apos;m a childNode&lt;/childNode&gt;&lt;/childNode&gt;" & _
        "&lt;otrema&gt;&#xF6;&lt;/otrema&gt;" & _
        "&lt;hyphen&gt;&#x2013;&lt;/hyphen&gt;" & _
    "&lt;/tests&gt;"
    
    Debug.Print HtmlDecode(htmlEncoded)
End Sub

Function HtmlDecode(str As String) As String
    Dim dom As Object

    Set dom = CreateObject("htmlfile")
    dom.Open
    dom.Write str
    dom.Close
    HtmlDecode = dom.Body.innerText
End Function

TestDecode 的格式化输出:

<tests>
    <eacute>é</eacute>
    <amp>&amp;</amp>
    <childNode><childNode attribute="testvalue">I'm a childNode</childNode></childNode>
    <otrema>ö</otrema>
    <hyphen>–&lt;/hyphen>
</tests>

此函数也适用于开头帖子中的字符串,但您会在“立即”窗口中看到问号。为了解决这个问题,我没有测试,你应该设置系统的语言环境: 在 Excel VBA 的即时窗口中显示日语文本

为了您的方便:

??ta????sµ?? pa???sµ??? ep?p?d?? st?? ?at??t?s

立即窗口将希腊字符转换为 ANSI,至少在我的情况下无法显示它们。

于 2021-03-09T20:32:38.883 回答
-1

将其粘贴到文件中并将其另存为 HTML 文件,然后在浏览器中打开它。

当我尝试时,我得到了一些奇怪的字体,比如希腊语或阿拉伯语,我相信它对你来说比对我更有意义:

Ανταγωνισμός παγκοσμίου επιπέδου στην κατάρτισ (希腊语)

于 2009-09-07T16:29:38.150 回答