vb.net中是否有一个函数可以告诉我们在UTF8 unicode排序规则下2字符串是否等效?

vb.net中是否有一个函数可以告诉我们在UTF8 unicode排序规则下2字符串是否等效?,vb.net,utf-8,collation,Vb.net,Utf 8,Collation,这个问题与类似,但我想要vb.net的函数,而不是PhP 最近我做了很多据说是独一无二的钥匙 某些键在UTF8 unicode排序规则下是等效的 例如,请看以下两个关键点: 拜尔斯街小酒馆38.15-79.07 拜尔斯街小酒馆‎__38.15-79.07 如果我把它粘贴到头版,看看你会看到的源代码 拜尔斯街小酒馆38.15-79.07 拜尔斯街小酒馆‎__38.15-79.07 注意:在堆栈溢出中,它们看起来仍然不同 我知道这不一样。我猜即使在堆栈交换中也不会显示。假设我有100万条这样的记录,

这个问题与类似,但我想要vb.net的函数,而不是PhP

最近我做了很多据说是独一无二的钥匙

某些键在UTF8 unicode排序规则下是等效的

例如,请看以下两个关键点:

拜尔斯街小酒馆38.15-79.07 拜尔斯街小酒馆‎__38.15-79.07

如果我把它粘贴到头版,看看你会看到的源代码

拜尔斯街小酒馆38.15-79.07

拜尔斯街小酒馆‎__38.15-79.07

注意:在堆栈溢出中,它们看起来仍然不同


我知道这不一样。我猜即使在堆栈交换中也不会显示。假设我有100万条这样的记录,我想测试MySQL UTF8排序规则是否会声明2个字符串相同。我想在上传之前知道。我该怎么做呢

所以vb.net认为这些是不同的键。当我们创建mysql查询并将其上传到数据库时,数据库抱怨它是同一个键。只要一个投诉,100万个数据库的上传就会被卡住

我们甚至不知道到底是什么‎? 我们到哪里去查呢

不管怎样,我想要一个函数,当给定2个字符串时,它会告诉我它们是否计数相同

如果可能的话,我们需要一个将字符串转换成最“标准”形式的函数

比如说,,‎ 似乎什么都不编码,函数将识别所有这些不编码字符并消除它们

有这样的事吗

到目前为止,我就是这么做的。我需要更全面的东西

    Private Function StraightenQuotesReplacement() As Generic.Dictionary(Of String, String)
    Static replacement As Generic.Dictionary(Of String, String)
    If replacement Is Nothing Then
        replacement = New Generic.Dictionary(Of String, String)
        replacement.Add(ChrW(&H201C), """")
        replacement.Add(ChrW(&H201D), """")
        replacement.Add(ChrW(&H2018), "'")
        replacement.Add(ChrW(&H2019), "'")
    End If
    Return replacement
End Function

<Extension()>
Public Function straightenQuotes(ByVal somestring As String) As String
    For Each key In StraightenQuotesReplacement.Keys
        somestring = somestring.Replace(key, StraightenQuotesReplacement.Item(key))
    Next
    Return somestring
End Function

<Extension()>
Public Function germanCharacter(ByVal s As String) As String
    Dim t = s
    t = t.Replace("ä", "ae")
    t = t.Replace("ö", "oe")
    t = t.Replace("ü", "ue")
    t = t.Replace("Ä", "Ae")
    t = t.Replace("Ö", "Oe")
    t = t.Replace("Ü", "Ue")
    t = t.Replace("ß", "ss")
    Return t
End Function
<Extension()>
Public Function japaneseCharacter(ByVal s As String) As String
    Dim t = s
    t = t.Replace("ヶ", "ケ")
    Return t
End Function

<Extension()>
Public Function greekCharacter(ByVal s As String) As String
    Dim t = s
    t = t.Replace("ς", "σ")
    t = t.Replace("ι", "ί")

    Return t
End Function
<Extension()>
Public Function franceCharacter(ByVal s As String) As String
    Dim t = s
    t = t.Replace("œ", "oe")
    Return t
End Function

<Extension()>
Public Function RemoveDiacritics(ByVal s As String) As String
    Dim normalizedString As String
    Dim stringBuilder As New StringBuilder
    normalizedString = s.Normalize(NormalizationForm.FormD)
    Dim i As Integer
    Dim c As Char
    For i = 0 To normalizedString.Length - 1
        c = normalizedString(i)
        If CharUnicodeInfo.GetUnicodeCategory(c) <> UnicodeCategory.NonSpacingMark Then
            stringBuilder.Append(c)
        End If
    Next
    Return stringBuilder.ToString()
End Function

<Extension()>
Public Function badcharacters(ByVal s As String) As String
    Dim t = s
    t = t.Replace(ChrW(8206), "")
    Return t
End Function

<Extension()>
Public Function sanitizeUTF8_Unicode(ByVal str As String) As String
    Return str.ToLower.removeDoubleSpaces.SpacetoDash.EncodeUrlLimited.straightenQuotes.RemoveDiacritics.greekCharacter.germanCharacter
End Function
Private函数rightQuotesReplace()作为泛型.Dictionary(字符串的,字符串的)
静态替换为泛型.Dictionary(字符串的,字符串的)
如果更换不算什么,那么
替换=新的泛型词典(字符串的,字符串的)
替换。添加(ChrW(&H201C),“”)
替换。添加(ChrW(&H201D),“”)
替换。添加(ChrW(&H2018),“”)
替换。添加(ChrW(&H2019),“”)
如果结束
退换货
端函数
公共函数将引号(ByVal somestring作为字符串)作为字符串
对于拉直QuotesReplacement.Keys中的每个键
somestring=somestring.Replace(键,拉直引号replacement.Item(键))
下一个
返回字符串
端函数
公共函数germanCharacter(ByVal s作为字符串)作为字符串
尺寸t=s
t=t.替换(“ä”、“ae”)
t=t.Replace(“oe”、“oe”)
t=t.Replace(“u”,“ue”)
t=t.替换(“Ä”、“Ae”)
t=t.替换(“Ö”、“Oe”)
t=t.替换(“Ü”、“Ue”)
t=t.替换(“ß”、“ss”)
返回t
端函数
公共函数japaneseCharacter(ByVal s作为字符串)作为字符串
尺寸t=s
t=t.Replace(“ヶ", "ケ")
返回t
端函数
公共函数greekCharacter(ByVal s作为字符串)作为字符串
尺寸t=s
t=t.替换(“σ”)
t=t.替换(“ι”、“ί”)
返回t
端函数
公共函数franceCharacter(ByVal s作为字符串)作为字符串
尺寸t=s
t=t.替换(“oe”)
返回t
端函数
公共函数RemoveDiacritics(ByVal s作为字符串)作为字符串
将规格化字符串设置为字符串
将stringBuilder调整为新的stringBuilder
normalizedString=s.Normalize(NormalizationForm.FormD)
作为整数的Dim i
dimcaschar
将i=0转换为normalizedString.Length-1
c=标准化字符串(i)
如果CharUnicodeInfo.GetUnicodeCegory(c)UnicodeCegory.NonSpacingMark,则
stringBuilder.Append(c)
如果结束
下一个
返回stringBuilder.ToString()
端函数
公共函数badcharacters(ByVal s作为字符串)作为字符串
尺寸t=s
t=t.替换(ChrW(8206),“”)
返回t
端函数
公共函数sanitizeUTF8_Unicode(ByVal str作为字符串)作为字符串
返回str.ToLower.removeDoubleSpaces.SpacetoDash.encodeurlimited.rightQuotes.RemoveDiacritics.greekCharacter.germanCharacter
端函数

对于看起来相似的字符,可能会使用不同的unicode码点,例如连字符减号(-U+002D)、连字符破折号(–U+2013)和em破折号(-U+2014)是三个看起来相似的不同字符:--

使用AscW()函数检查每个字符

编辑:


如下面评论中所述,使用System.Text.NormalizationForm命名空间确定哪些Unicode代码点被视为等效字符。

对于看起来相似的字符,可能会使用不同的Unicode代码点,例如连字符减号(-U+002D)、连字符(–U+2013)和em-dash(-U+2014)三个不同的角色看起来都很相似:————

Option Explicit
Public Sub DsplInHex(Stg As String)

  Dim Pos As Long

  For Pos = 1 To Len(Stg)
    Debug.Print Hex(AscW(Mid(Stg, Pos, 1))) & " ";
  Next
  Debug.Print

End Sub
使用AscW()函数检查每个字符

编辑:


如下面的注释所述,使用System.Text.NormalizationForm命名空间确定哪些Unicode代码点被视为等效字符。

我使用下面的VBA代码来调查奇怪的字符串

Option Explicit
Public Sub DsplInHex(Stg As String)

  Dim Pos As Long

  For Pos = 1 To Len(Stg)
    Debug.Print Hex(AscW(Mid(Stg, Pos, 1))) & " ";
  Next
  Debug.Print

End Sub
我将“byers street”行复制到Excel工作表的D18单元格,并在即时窗口中键入
call dsplinex(Range(“D18”)
。结果是:

62 79 65 72 73 2D 73 74 72 65 65 74 2D 62 69 73 74 72 6F 5F 33 38 2E 31 35 2D 37 39 2E 30 37 20 62 79 65 72 73 2D 73 74 72 65 65 74 2D 62 69 73 74 72 6F 200E 5F 33 38 2E 31 35 2D 37 39 2E 30 37 
添加换行符和一些空格可提供:

62 79 65 72 73 2D 73 74 72 65 65 74 2D 62 69 73 74 72 6F      5F 33 38 2E 31 35 2D 37 39 2E 30 37 20 
62 79 65 72 73 2D 73 74 72 65 65 74 2D 62 69 73 74 72 6F 200E 5F 33 38 2E 31 35 2D 37 39 2E 30 37 

根据我的Unicode书籍
200E
是一个
从左到右的标记
。我很想知道您是如何将该字符添加到密钥的

VB.NET是正确的;这些键是不同的。要么MySQL删除这些字符,要么您的传输过程将其删除。无论哪种方式,您都需要检查源数据中是否有有趣的字符

Option Explicit
Public Sub DsplInHex(Stg As String)

  Dim Pos As Long

  For Pos = 1 To Len(Stg)
    Debug.Print Hex(AscW(Mid(Stg, Pos, 1))) & " ";
  Next
  Debug.Print

End Sub

我使用下面的VBA代码来研究奇怪的字符串

我将“byers street”行复制到Excel工作表的D18单元格,并在即时窗口中键入
call dsplinex(Range(“D18”)
。结果是:

62 79 65 72 73 2D 73 74 72 65 65 74 2D 62 69 73 74 72 6F 5F 33 38 2E 31 35 2D 37 39 2E 30 37 20 62 79 65 72 73 2D 73 74 72 65 65 74 2D 62 69 73 74 72 6F 200E 5F 33 38 2E 31 35 2D 37 39 2E 30 37 
添加换行符和一些空格可提供:

62 79 65 72 73 2D 73 74 72 65 65 74 2D 62 69 73 74 72 6F      5F 33 38 2E 31 35 2D 37 39 2E 30 37 20 
62 79 65 72 73 2D 73 74 72 65 65 74 2D 62 69 73 74 72 6F 200E 5F 33 38 2E 31 35 2D 37 39 2E 30 37 

根据我的Unicode书籍
200E
是一个
从左到右的标记