1

この質問はHow to emulate MySQLs utf8_general_ci collat​​ion 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
4

2 に答える 2

1

おそらく、似ている文字に異なる Unicode コード ポイントを使用している可能性があります。似ている: - - -

各文字を確認するには、AscW() 関数を使用します。

編集:

以下のコメントで説明されているように、System.Text.NormalizationForm 名前空間を使用して、どの Unicode コード ポイントが同等の文字と見なされるかを判断します。

于 2012-05-23T04:43:28.150 に答える
0

以下の VBA コードを使用して、奇妙な文字列を調査しました。

「byers-street」行を Excel ワークシートのセル D18 にコピーcall DsplInHex(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の本によると200ELeft-To-Right Mark. どのようにしてその文字をキーに追加したのか知りたいです。

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
于 2012-05-23T21:49:11.830 に答える