Как преобразовать символ Юникода в его эквивалент ASCII

StackOverflow https://stackoverflow.com/questions/138449

  •  02-07-2019
  •  | 
  •  

Вопрос

Вот проблема:

В C# я получаю информацию из устаревшей базы данных ACCESS..NET преобразует содержимое базы данных (в случае этой проблемы — строку) в Unicode, прежде чем передать его мне.

Как мне преобразовать эту строку Unicode обратно в ее эквивалент ASCII?


Редактировать
Символ Unicode 710 действительно является БУКВОЙ-МОДИФИКАТОРОМ CIRCUMFLEX ACCENT.Вот проблема немного точнее:

 -> (Extended) ASCII character ê (Extended ASCII 136) was inserted in the database.
 -> Either Access or the reading component in .NET converted this to U+02C6 U+0065
    (MODIFIER LETTER CIRCUMFLEX ACCENT + LATIN SMALL LETTER E)
 -> I need the (Extended) ASCII character 136 back.


Вот что я пробовал (теперь я понимаю, почему это не сработало...):

string myInput = Convert.ToString(Convert.ToChar(710));
byte[] asBytes = Encoding.ASCII.GetBytes(myInput);

Но в результате получается не 94, а байт со значением 63...
Вот новая попытка, но она все еще не работает:

byte[] bytes = Encoding.ASCII.GetBytes("ê");


Решение
Спасибо обоим csгеро и бзлм за указание в правильном направлении я решил проблему здесь.

Это было полезно?

Решение

Хорошо, давайте уточним.Оба csгеро и бзлм указал в правильном направлении.

Из-за ответа blzm я просмотрел страницу Windows-1252 в вики и обнаружил, что она называется кодовой страницей.Статья в Википедии для Кодовая страница в котором говорилось следующее:

Для этих целей не существовало формального стандарта.расширенные наборы символов';IBM просто называла эти варианты кодовыми страницами, как всегда делала с вариантами кодировок EBCDIC.

Это привело меня к кодовой странице 437:

В кодовых страницах, совместимых с ASCII, нижние 128 символов сохраняют свои стандартные значения US-ASCII, а в верхних 128 символах могут быть доступны различные страницы (или наборы символов).Например, компьютеры DOS, созданные для рынка Северной Америки, использовали кодовая страница 437, который включал символы с диакритическими знаками, необходимые для французского, немецкого и некоторых других европейских языков, а также некоторые графические символы для рисования линий.

Итак, кодовая страница 437 была кодовой страницей, которую я называл «расширенным ASCII», в ней был символ ê в качестве символа 136, поэтому я поискал и некоторые другие символы, и они кажутся правильными.

csgero поставляется с подсказкой Encoding.GetEncoding(), я использовал ее для создания следующего оператора, который решает мою проблему:

byte[] bytes = Encoding.GetEncoding(437).GetBytes("ê");

Другие советы

Здесь нельзя использовать кодировку ASCII по умолчанию (Encoding.ASCII), но необходимо создать кодировку с соответствующей кодовой страницей с помощью Encoding.GetEncoding(...).Вы можете попробовать использовать кодовую страницу 1252, которая является расширенной версией ISO 8859-1.

ASCII не определяет ê;число 136 происходит от номера циркумфлекса в 8-битных кодировках, таких как Windows-1252.

Можете ли вы убедиться, что маленькая буква «е» с циркумфлексом (ê) на самом деле является тем, что в этом случае должно храниться в базе данных Access?Возможно, U+02C6 U+0065 является результатом ошибки преобразования, когда на входе фактически находится e. с последующим циркумфлекс или что-то совсем другое.Возможно, ваша база данных Access содержит поврежденные данные в том смысле, что назначенная кодировка не соответствует содержимому, и в этом случае клиент .NET может неправильно проанализировать данные (используя неправильный декодер).

Если эта ошибка действительно возникает во время чтения из базы данных, возможно, может помочь вставка некоторого кода или настроек конфигурации.

В Кодовая страница 437, символ номер 136 — это буква e с циркумфлексом.

Хм… Я не понимаю, какого персонажа вы имеете в виду.Каретка («^», CIRCUMFLEX ACCENT) имеет одинаковый код в ASCII и Unicode (U+005E).

/РЕДАКТИРОВАТЬ:Блин, я виноват.710 (U+02C6) на самом деле является БУКВОЙ-МОДИФИКАТОРОМ ОКРУЖНЫМ АКЦЕНТОМ.К сожалению, этот символ вообще не является частью ASCII.Это может выглядеть как обычная каретка, но это другой символ.Простое преобразование здесь не поможет.Я не уверен, поддерживает ли .NET сопоставление похожих символов при преобразовании из Unicode.Однако стоит изучить.

Значение 63 — это вопросительный знак, также известный как «Я не могу отобразить этот символ в ASCII».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top