На веб-сайте ASP.NET 4, и я получаю следующую ошибку при попытке загрузить данные из базы данных в GridView.
Невозможно перевести символ Unicode \ uD83D с индексом 49 в указанный кодстр.
Я обнаружил, что это происходит, когда строка данных содержит: Текст Текст Текст ??
Как я понимаю, этот текст не может быть переведенв действительный ответ utf-8.
Это действительно причина?
Есть ли способ очистить текст перед загрузкой впросмотр сетки для предотвращения таких ошибок?
ОБНОВЛЕНИЕ:
У меня есть некоторый прогресс, который я обнаружил, я получаю только эту ошибкукогда я использую метод подстроки на строку.(Я использую подстроку, чтобы показать часть текста в качестве предварительного просмотра пользователю).
Например, в веб-форме 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 или просто удалить недействительные символы?
Спасибо!