Как конвертировать размещенные «английские» символы с международных компьютеров в ASP.NET? (бывший 2205) - PullRequest
2 голосов
/ 05 июля 2010

У меня есть страница поиска WebForm, на которую периодически приходят посетители со всего мира.Когда они вводят текст, кажется, что это обычный ASCII az, 0-9, но они напечатаны жирным шрифтом, и моя логика «это этот текст» не может обработать ввод.Есть ли в ASP.NET простой способ конвертировать символы Юникода, равные AZ, 0-9, в обычный старый текст?

Ответы [ 4 ]

5 голосов
/ 17 июля 2010

Вы получаете так называемые "Полноразмерные формы" персонажей. В Unicode они кодируются в кодовых точках от U + FF01 до U + FF5E. Чтобы получить код ASCII (от U + 0021 до U + 007E) от них, вы должны получить их код и вычесть (0xFF01 - 0x0021) из него.

ASCII: http://unicode.org/charts/PDF/U0000.pdf
Форма полной ширины: http://unicode.org/charts/PDF/UFF00.pdf

Я не говорю на ASP.NET, но в Java код будет выглядеть так:

String decodeFullwidth(String s) {
  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    if (0xFF01 <= c && c <= 0xFF5E) {
      sb.append((char) (c - (0xFF01 - 0x0021)));
    } else {
      sb.append(c);
    }
  }
  return sb.toString();
}
3 голосов
/ 22 июля 2010

Вам стоит посмотреть ответ от на этот вопрос .

Включает следующий метод (из записи в блоге Майкла Каплана " Разборка - интересная работа "):

static string RemoveDiacritics(string stIn) {
  string stFormD = stIn.Normalize(NormalizationForm.FormD);
  StringBuilder sb = new StringBuilder();

  for(int ich = 0; ich < stFormD.Length; ich++) {
    UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
    if(uc != UnicodeCategory.NonSpacingMark) {
      sb.Append(stFormD[ich]);
    }
  }

  return(sb.ToString().Normalize(NormalizationForm.FormC));
}

Это удалит все символы NonSpacingMark из строки. Это означает, что он преобразует é в e, потому что é фактически построен из символов e и ´.
´ - это «NonSpacingMark», что означает, что он будет добавлен к предыдущему символу. Метод пытается обнаружить эти специальные символы и перестраивает строку без символов NonSpacingMark. (Вот как я понимаю, это может быть не так).

Это не будет работать для всех символов Юникода, но ввод от пользователей, использующих набор символов латинского алфавита (английский, испанский, французский, немецкий и т. Д.), Будет "очищен" У меня нет опыта работы с азиатскими наборами символов.


После обратной связи

Я приспособил рутину к информации, которую получил из комментариев и ответов на этот вопрос. Моя текущая версия:

    public static string RemoveDiacritics(string stIn) {
        string stFormD = stIn.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        for (int ich = 0; ich < stFormD.Length; ich++) {
            UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
            switch (uc) {
                case UnicodeCategory.NonSpacingMark:
                    break;
                case UnicodeCategory.DecimalDigitNumber:
                    sb.Append(CharUnicodeInfo.GetDigitValue(stFormD[ich]).ToString());
                    break;
                default:
                    sb.Append(stFormD[ich]);
                    break;
            }
        }

        return (sb
            .ToString()
            .Normalize(NormalizationForm.FormKC));
    }

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

3 голосов
/ 18 июля 2010

кажется, что это обычный ASCII az, 0-9, но они напечатаны жирным шрифтом

Это могут быть символы математического жирного шрифта Unicode ????????????????????????????????????.Но, скорее всего, это символы «полной ширины» abcdefghijklmnopqrstuvwxyz0123456789.(Они распространены в кодировках символов Восточной Азии: «полная ширина» означает ширину, равную ширине символа Ханзи / Кандзи.)

Чтобы преобразовать любой из параметров в ASCII, используйте нормализация Юникода Форма КС или КД.

0 голосов
/ 16 июля 2010

Вы можете попробовать что-то вроде этого:

Encoding.ASCII.GetString(Encoding.Convert(UnicodeEncoding, ASCIIEncoding, Encoding.Unicode.GetBytes(myString)));

Хотя я не совсем уверен, в чем проблема с вводом.Что именно вы делаете с текстом?Имеет ли значение, если он содержит больше, чем просто символы ASCII?И я особенно не знаю, что вы подразумеваете под «они напечатаны жирным шрифтом».

...