.NET: Как мне узнать, поддерживает ли кодировка все символы в моей строке? - PullRequest
3 голосов
/ 10 марта 2009

У меня есть много текста, который мне нужно вывести, который включает в себя всевозможные символы из разных языков. Иногда мне нужно выводить текст в кодировках символов, отличных от Unicode (например, Shift-JIS или ISO-8859-2), чтобы соответствовать странице, на которую он идет.

Если в тексте есть символы, которые кодировка не может обработать (например, японские символы в кодированном выводе ISO-8859-2), я получаю странные символы в выводе. Я могу избежать их, но я бы предпочел сделать это, только если это действительно необходимо.

Итак, мой вопрос таков: могу ли я заранее сказать, может ли кодировка обрабатывать все символы в моей строке?

EDIT: Я думаю, что EncoderFallback, вероятно, является правильным ответом на вопрос, который я задал. К сожалению, это не работает в моей конкретной ситуации. Моя мысль заключалась в том, чтобы преобразовать символы в их эквиваленты сущности HTML (например, モ вместо モ). Однако кодер конвертирует только первый такой символ, который находит, и если я устанавливаю Response.ContentEncoding, он вообще никогда не вызывает мой EncoderFallback.

Ответы [ 4 ]

5 голосов
/ 10 марта 2009

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

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

Вместо этого вашему классу Fallback нужно обрабатывать только те замены, где кодировка не имеет значения для символа.

3 голосов
/ 10 марта 2009

Попробуйте закодировать строку с помощью кодировки, для которой EncoderFallback имеет значение EncoderExceptionFallback . eg.:

Encoding e= Encoding.GetEncoding(932, new EncoderExceptionFallback(), new DecoderExceptionFallback());

Затем перехватывает EncoderFallbackException , когда вы получаете GetBytes ().

0 голосов
/ 10 марта 2009

Я думаю, что методы уже должны работать. (Решение EncoderFallback кажется довольно хорошим.) Однако, если вы предпочитаете его, вот альтернатива.

Создайте кодировщик для кодировки, которую вы хотите проверить, вызвав encoding.GetEncoder (). Затем вы можете вызвать метод Convert объекта Encoder, передав свой текст и посмотрев на значение параметра complete out, чтобы определить, успешно он выполнен или нет.

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

0 голосов
/ 10 марта 2009

Преобразовать его в целевую кодировку, преобразовать обратно и сравнить с оригиналом?

Попробуйте Encoding.GetBytes () и Encoding.GetStrings () для преобразования отсюда и далее.

В качестве оптимизации вы можете найти все используемые символы Юникода в исходной строке и просто использовать это для проверки кодировки.

...