ASP.NET - Невозможно перевести символ Unicode XXX с индексом YYY на указанную кодовую страницу - PullRequest
15 голосов
/ 19 марта 2012

На веб-сайте ASP.NET 4, и я получаю следующую ошибку при попытке загрузить данные из базы данных в GridView.

Невозможно перевести символ Unicode \ uD83D с индексом 49 в указанный кодстр.

Я обнаружил, что это происходит, когда строка данных содержит: Текст Текст Текст ??

Как я понимаю, этот текст не может быть переведенв действительный ответ utf-8.

  1. Это действительно причина?

  2. Есть ли способ очистить текст перед загрузкой впросмотр сетки для предотвращения таких ошибок?


ОБНОВЛЕНИЕ:

У меня есть некоторый прогресс, который я обнаружил, я получаю только эту ошибкукогда я использую метод подстроки на строку.(Я использую подстроку, чтобы показать часть текста в качестве предварительного просмотра пользователю).

Например, в веб-форме ASP.NET я делаю это:

String txt = test ??;

//txt string can also be created by 
String txt = char.ConvertFromUtf32(116) + char.ConvertFromUtf32(101) +char.ConvertFromUtf32(115) + char.ConvertFromUtf32(116) + char.ConvertFromUtf32(32) + char.ConvertFromUtf32(128148);

// this works ok txt is shown in the webform label.
Label1.Text = txt; 

//length is equal to 7.
Label2.Text = txt.Length.ToString();

//causes exception - Unable to translate Unicode character \uD83D at index 5 to specified code page.
Label3.Text = txt.Substring(0, 6);

Я знаю, что строка .NET основана на utf-16, который поддерживает суррогатные пары.

Когда я использую функцию SubString, я случайно порваю суррогатную пару и вызывает исключение.Я обнаружил, что могу использовать StringInfo class :

var si = new System.Globalization.StringInfo(txt);
var l = si.LengthInTextElements; // length is equal to 6.
Label3.Text = si.SubstringByTextElements(0, 5); //no exception!

Другая альтернатива - просто удалить суррогатные пары:

Label3.Text = ValidateUtf8(txt).Substring(0, 3); //no exception!

    public static string ValidateUtf8(string txt)
            {
                StringBuilder sbOutput = new StringBuilder();
                char ch;

                for (int i = 0; i < body.Length; i++)
                {
                    ch = body[i];
                    if ((ch >= 0x0020 && ch <= 0xD7FF) ||
                            (ch >= 0xE000 && ch <= 0xFFFD) ||
                            ch == 0x0009 ||
                            ch == 0x000A ||
                            ch == 0x000D)
                    {
                        sbOutput.Append(ch);
                    }

                }
                return sbOutput.ToString();
            }

Действительно ли это проблема суррогатных пар?

Какие персонажи используют суррогатные пары?есть ли список?

Должен ли я поддерживать суррогатные пары?я должен пойти с использованием StringInfo Class или просто удалить недействительные символы?

Спасибо!

Ответы [ 3 ]

21 голосов
/ 24 апреля 2012

Вы можете сначала попытаться кодировать текст в UTF8 (в событии с привязкой к строке или чем-то подобным).Следующий код закодирует текст в UTF8 и удалит не кодируемые символы.

private static readonly Encoding Utf8Encoder = Encoding.GetEncoding(
    "UTF-8",
    new EncoderReplacementFallback(string.Empty),
    new DecoderExceptionFallback()
);

var utf8Text = Utf8Encoder.GetString(Utf8Encoder.GetBytes(text));
0 голосов
/ 18 июля 2013

Я только что обнаружил, что Маршрутизация запросов приложений при установке в IIS 7.5 заставит %2f обрабатываться по-разному, вызывая проблемы.

Удаление ARR решило эту проблему для нас.

0 голосов
/ 22 марта 2012

Символ U + 1F60A - символ смайлика, представленный в Unicode 6.0. Его представление UTF-16 (SQL Server (вы не упомянули базу данных, которую вы используете) использует аналогичный UCS-2) - 0xD83D 0xDE0A с использованием суррогатных символов.

Поскольку Unicode 6.0 был выпущен в октябре 2010 , моя догадка заключается в том, что либо SQL Server, либо (ASP) .Net 4, либо преобразование между данными SQL Server и .Net данные не поддерживают кодовые точки эмодзи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...