この質問はHow to emulate MySQLs utf8_general_ci collation in PHP string comparisons に似ていますが、PhP ではなく vb.net の関数が必要です。
最近はユニークキーと思われるものをたくさん作っています。
一部のキーは、UTF8 Unicode 照合の下で同等です。
たとえば、次の 2 つのキーを見てください。
byers-street-bistro__38.15_-79.07 byers-street-bistro __38.15_-79.07
それをフロントページに貼り付けてソースコードを見ると、
byers-street-bistro__38.15_-79.07
byers-street-bistro __38.15_-79.07
注: スタック オーバーフローでは、それらはまだ異なって見えます。
私はそれが同じではないことを知っています。スタック交換でも表示されないと思います。そのようなレコードが 100 万あり、2 つの文字列が MySQL UTF8 照合によって同じように宣言されるかどうかをテストしたいとします。アップロードする前に知りたいです。それ、どうやったら出来るの。
したがって、vb.net はそれらが異なるキーであると考えています。mysql クエリを作成してデータベースにアップロードすると、データベースは同じキーであると不平を言います。たった 1 件の苦情で、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