Как Вы удаляете недопустимые шестнадцатеричные символы из основанного на XML источника данных до построения XmlReader или XPathDocument, который использует данные?

Если вы используете CentOS, вам нужно использовать

  1. yum install python34-devel.x86_64
  2. yum groupinstall -y 'development tools'
  3. pip3 install mysql-connector
  4. pip install mysqlclient
74
задан Grhm 31 October 2013 в 13:33
поделиться

4 ответа

Это не может быть прекрасно (акцент, добавленный начиная с людей, пропускающих эту правовую оговорку), но что я сделал, в этом случае ниже. Можно корректироваться к использованию с потоком.

/// <summary>
/// Removes control characters and other non-UTF-8 characters
/// </summary>
/// <param name="inString">The string to process</param>
/// <returns>A string with no control characters or entities above 0x00FD</returns>
public static string RemoveTroublesomeCharacters(string inString)
{
    if (inString == null) return null;

    StringBuilder newString = new StringBuilder();
    char ch;

    for (int i = 0; i < inString.Length; i++)
    {

        ch = inString[i];
        // remove any characters outside the valid UTF-8 range as well as all control characters
        // except tabs and new lines
        //if ((ch < 0x00FD && ch > 0x001F) || ch == '\t' || ch == '\n' || ch == '\r')
        //if using .NET version prior to 4, use above logic
        if (XmlConvert.IsXmlChar(ch)) //this method is new in .NET 4
        {
            newString.Append(ch);
        }
    }
    return newString.ToString();

}
74
ответ дан Eugene Katz 24 November 2019 в 11:51
поделиться

Мне нравится понятие белого списка Eugene. Я должен был сделать подобную вещь как исходный плакат, но я должен был поддерживать все символы Unicode, не только до 0x00FD. Спецификация XML:

Символ = #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

В.NET, внутреннее представление символов Unicode составляет только 16 битов, таким образом, мы не можем 'позволить' 0x10000-0x10FFFF явно. Спецификация XML явно запрещает суррогатные кодовые точки, начинающие в 0xD800 с появления. Однако возможно, что, если мы позволили эти суррогатные кодовые точки в нашем белом списке, utf-8 кодирование нашей строки, мог бы произвести допустимый XML в конце, пока надлежащее кодирование utf-8 было произведено из суррогатных пар utf-16 символов в строке.NET. Я не исследовал это, хотя, таким образом, я пошел с более безопасной ставкой и не позволил суррогаты в своем белом списке.

комментарии в решении Eugene вводят в заблуждение, хотя, проблема состоит в том, что символы, которые мы исключаем, не допустимы в XML... они - совершенно допустимые кодовые точки Unicode. Мы не удаляем 'non-utf-8 символы. Мы удаляем utf-8 символы, которые не могут появиться в правильно построенных XML-документах.

public static string XmlCharacterWhitelist( string in_string ) {
    if( in_string == null ) return null;

    StringBuilder sbOutput = new StringBuilder();
    char ch;

    for( int i = 0; i < in_string.Length; i++ ) {
        ch = in_string[i];
        if( ( ch >= 0x0020 && ch <= 0xD7FF ) || 
            ( ch >= 0xE000 && ch <= 0xFFFD ) ||
            ch == 0x0009 ||
            ch == 0x000A || 
            ch == 0x000D ) {
            sbOutput.Append( ch );
        }
    }
    return sbOutput.ToString();
}
60
ответ дан dnewcome 24 November 2019 в 11:51
поделиться
private static String removeNonUtf8CompliantCharacters( final String inString ) {
    if (null == inString ) return null;
    byte[] byteArr = inString.getBytes();
    for ( int i=0; i < byteArr.length; i++ ) {
        byte ch= byteArr[i]; 
        // remove any characters outside the valid UTF-8 range as well as all control characters
        // except tabs and new lines
        if ( !( (ch > 31 && ch < 253 ) || ch == '\t' || ch == '\n' || ch == '\r') ) {
            byteArr[i]=' ';
        }
    }
    return new String( byteArr );
}
-1
ответ дан 24 November 2019 в 11:51
поделиться

Попробуйте это для PHP!

$goodUTF8 = iconv("utf-8", "utf-8//IGNORE", $badUTF8);
-5
ответ дан 24 November 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: