删除经典ASP/VBScript(与MySQL相关)中的四字节UTF-8字符

删除经典ASP/VBScript(与MySQL相关)中的四字节UTF-8字符,mysql,unicode,utf-8,vbscript,asp-classic,Mysql,Unicode,Utf 8,Vbscript,Asp Classic,我已经花了18个小时尝试不同的东西,四处搜索,最后我放弃了,不得不问你们 后台故事:我终于将一个旧的MS Access数据库迁移到MySQL(版本5.6.16-log) 问题:Access数据库中的某些Unicode文本包含四个字节(UTF-8) MySQL仍然存在插入四字节UTF-8字符的问题。这个问题越来越老了,我惊讶地发现它还没有解决: 我正在使用“MySQL ODBC 5.3 Unicode驱动程序”在数据库之间传输数据(最新的beta开发版本)。无论我尝试什么,当我尝试插入带有4字节U

我已经花了18个小时尝试不同的东西,四处搜索,最后我放弃了,不得不问你们

后台故事:我终于将一个旧的MS Access数据库迁移到MySQL(版本5.6.16-log)

问题:Access数据库中的某些Unicode文本包含四个字节(UTF-8)

MySQL仍然存在插入四字节UTF-8字符的问题。这个问题越来越老了,我惊讶地发现它还没有解决:

我正在使用“MySQL ODBC 5.3 Unicode驱动程序”在数据库之间传输数据(最新的beta开发版本)。无论我尝试什么,当我尝试插入带有4字节UTF8字符的字符串时,进程最终会冻结(线程永远使用100%的CPU)。我已经尝试了互联网上所有建议的解决方法,但没有任何效果

现在我只接受MySQL的限制:我不能存储所有Unicode字符

因此,在将文本插入数据库之前,我想从文本中删除所有4字节UTF8字符。但我不能为我的生活找到一种方法来做它在经典的ASP

有人能帮忙吗

(顺便说一句,我不能使用ASP,有太多的代码需要用不同的语言重写。仅仅更改数据库是一项了不起的壮举;其中有几个数据库,需要几天才能完成。)

编辑:JScript中的解决方案也是可以接受的,因为它可以从ASP页面运行。

这应该可以:

Function UTF8Filter(strString)
    On Error Resume Next
    For i = 1 to Len(strString)

        charCode = AscW(Mid(strString, i, 1))
        If charCode > 32 AND charCode <= 127 then   ' here was OR 
            'Append valid character'
            strString = Mid(strString, i, 1)
        End If
    Next

    UTF8Filter = strString
    On Error Goto 0
End Function

我以前试过,但没用。ASP页面使用UTF8中的字符串,而Asc总是只返回UTF8字符的1或32(我认为是32)…我将Asc切换为AscW,试试看。不过我终于找到了一个解决方法。我使用两个ADODB.Stream对象并遍历UTF8字符串中的每个字符,将其从字符集UTF8转换为字符集Windows-1252,然后在另一个Stream对象上进行相反的转换。在倒过来之前,我可以测量Windows-1252编码字符串的Len(),如果它是4-6,就可以了(包括始终为三个字节的BOM表)。在数据库中插入的每个字符串上都必须执行此操作,但由于用户可以输入奇怪的UTF8字符,我找不到其他方法来防止可能的线程冻结。您可能在if语句中的意思是“charCode>=32和charCode<127”,对吧?否则它发现没有可接受的字符。无论如何,尝试了一下,它删除了所有UTF8字符,这是不可接受的。但是谢谢你的帮助。但愿如此简单。这个函数让我想起了每个人都同意不同的解决方案,每个人都在指出每个人正确解决方案的错误=P不管怎样,我试过你的代码,它不起作用。这个过程永远冻结了。也许4个len UTF8字符从一开始就不是我的问题,毕竟我从来没有得到过确切的错误。然而,不管出了什么问题,我很高兴最终找到了解决办法。即使它会降低性能。为什么不使用
@codepage=1252
Response.codepage=1252
停止Unicode字符的输入,这样在odbc驱动程序支持它之前就不必处理这个问题了?18小时!!只要使用MSSQLServer,就可以省去一些心痛。MySQL的新一天,新麻烦。今天我发现,如果MySQL不认为“a”和“á”是同一个字符,就不能进行不区分大小写的匹配(排序)。我需要类似于utf8\u bin\u ci排序规则的东西,但它不存在。这是因为我需要能够在一个唯一的索引字段中插入“abc”和“ábc”,然后搜索“abc”,找到“abc”而不是“ábc”。这对我来说几乎是MySQL的死亡,我将尝试MS SQL。。。然后,我也不必改变很多标准的SQL转义(例如,MySQL中的“needtobe\”,而大多数其他数据库中的“needtobe”)。
Function Remove4ByteUFT8(strString)
    Set objRegEx = CreateObject("VBScript.RegExp")
    objRegEx.Global = True   
    objRegEx.IgnoreCase = True
    objRegEx.Pattern = "/[\xF0-\xF7].../s"

    Remove4ByteUFT8 = objRegEx.Replace(strString, "")
End Function