Я пытаюсь преобразовать некоторые строки, которые написаны на французском канадском языке и, в основном, я хотел бы иметь возможность убрать французские знаки ударения в письмах, сохраняя письмо. (Например , обращенные é
к e
, так crème brûlée
стал бы creme brulee
)
Каков наилучший метод для достижения этой цели?
.net
string
diacritics
Джеймс Холл
источник
источник
Ответы:
Я не использовал этот метод, но Майкл Каплан описывает метод для этого в своем блоге (с непонятным названием), в котором говорится о разборке диакритических знаков: раздевание - это интересная работа (иначе говоря, о значении бессмысленных, то есть всех символах Mn). не интервал, но некоторые больше, чем другие)
Обратите внимание, что это продолжение его предыдущего поста: раздевание диакритики ....
Подход использует String.Normalize для разделения входной строки на составные глифы (в основном отделяющие «базовые» символы от диакритических знаков), а затем сканирует результат и сохраняет только базовые символы. Это немного сложно, но на самом деле вы смотрите на сложную проблему.
Конечно, если вы ограничиваете себя французским языком, вы, вероятно, можете обойтись без простого табличного подхода в разделе Как удалить акценты и тильды в C ++ std :: string , как это рекомендовано @David Dibben.
источник
это помогло мне ...
быстрый и короткий!
источник
«
»
и…
(как один символ), будут изменены в процессе, что не соответствует принятому решению.System.ArgumentException: 'ISO-8859-8' is not a supported encoding name.
System.Text.Encoding.CodePages
из nuget, а затем позвоните, чтобы зарегистрировать провайдера:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- как только вы это сделаете, вы можете использовать ISO-8859-8В случае, если кому-то интересно, я искал что-то подобное и заканчивал писать следующее:
источник
c < 128
, чтобы убедиться, что мы не принимаем UTF-символы, см. Здесь .c < 123
. см. ASCIМне нужно было что-то, что преобразует все основные символы Юникода, и голосующий ответ оставил несколько, поэтому я создал версию CodeIgniter's для
convert_accented_characters($str)
C #, которая легко настраивается:Применение
источник
if (entry.Key.IndexOf(c) != -1)
наif (entry.Key.Contains(c))
{ "äæǽ", "ae" }
вместо того, чтобы{ "ä", "ae" }, { "æ", "ae" }, { "ǽ", "ae" }
просто звонитьif (foreign_characters.TryGetValue(...)) ...
. Вы полностью опровергли назначение индекса, который уже есть в словаре.Если кому-то интересно, вот эквивалент Java:
источник
Я часто использую метод расширения, основанный на другой версии, которую я нашел здесь (см. Замена символов в C # (ascii) ). Краткое объяснение:
Код:
источник
CodePage греческого (ISO) может сделать это
Информация об этой кодовой странице находится в
System.Text.Encoding.GetEncodings()
. Узнайте о: https://msdn.microsoft.com/pt-br/library/system.text.encodinginfo.getencoding(v=vs.110).aspxГреческий (ISO) имеет кодовую страницу 28597 и имя iso-8859-7 .
Перейти к коду ... \ o /
Итак, напишите эту функцию ...
Обратите внимание, что ...
Encoding.GetEncoding("iso-8859-7")
эквивалентно тому,Encoding.GetEncoding(28597)
что first - это имя, а второе - кодовая страница Encoding.источник
äáčďěéíľľňôóřŕšťúůýž ÄÁČĎĚÉÍĽĽŇÔÓŘŔŠŤÚŮÝŽ ÖÜË łŁđĐ ţŢşŞçÇ øı
). Проблемы были найдены только сßə
, которые преобразуются в?
, но такие исключения всегда могут быть обработаны отдельным способом. Прежде чем приступить к работе, лучше провести тест на все области Unicode, содержащие буквы с диакритическими знаками.Забавно, что на такой вопрос можно получить так много ответов, но ни один из них не соответствует моим требованиям :) Вокруг так много языков, полное AFNIK решение, не зависящее от языка, на самом деле невозможно, так как другие упоминают, что FormC или FormD создают проблемы.
Поскольку первоначальный вопрос был связан с французским языком, самый простой рабочий ответ действительно
1251 следует заменить кодом кодирования языка ввода.
Это, однако, заменить только один символ одним символом. Так как я также работаю с немецким языком ввода, я сделал ручное преобразование
Он может не обеспечивать наилучшую производительность, но, по крайней мере, его очень легко читать и расширять. Regex - это НЕТ GO, намного медленнее, чем любой символ / строка.
У меня также есть очень простой способ удалить пробел:
В конце концов, я использую комбинацию всех трех вышеупомянутых расширений:
И небольшой юнит-тест к тому (не исчерпывающему), который успешно пройден.
источник
Это прекрасно работает в Java.
Он в основном конвертирует все акцентированные символы в их деацентированные аналоги, а затем их объединяющие диакритические знаки. Теперь вы можете использовать регулярные выражения, чтобы удалить диакритические знаки.
источник
"\\p{Block=CombiningDiacriticalMarks}"
TL; DR - C # метод расширения строки
Я думаю , что лучшее решение сохранить смысл строки, чтобы преобразовать символы вместо зачистки их, что хорошо видно на примере
crème brûlée
сcrme brle
VS.creme brulee
.Я прочитал комментарий Александра выше и увидел, что код Lucene.Net лицензирован на Apache 2.0, поэтому я изменил класс в простой метод расширения строки. Вы можете использовать это так:
Эта функция слишком длинна для отправки в ответе StackOverflow (~ 139 тыс. Символов по 30 тыс. Разрешено lol), поэтому я сделал суть и приписал авторов :
Надеюсь, это поможет кому-то еще, это самое надежное решение, которое я нашел!
источник
Это версия VB (работает с греческим):
Импортирует System.Text
Система импорта. Глобализация
источник
Попробуйте пакет HelperSharp .
Есть метод RemoveAccents:
источник
Вот как я заменяю диакритические знаки недиакритическими во всех моих программах .NET
C #:
VB .NET:
источник
Вы можете использовать расширение строки из пакета nuget MMLib.Extensions:
Страница Nuget: https://www.nuget.org/packages/MMLib.Extensions/ Сайт проекта Codeplex https://mmlib.codeplex.com/
источник
Зайдите в эту библиотеку здесь, если вы еще не рассмотрели ее. Похоже, есть полный спектр юнит-тестов с ним.
https://github.com/thomasgalliker/Diacritics.NET
источник
источник
Что сказал этот человек:
Encoding.ASCII.GetString(Encoding.GetEncoding(1251).GetBytes(text));
На самом деле он разделяется на
å
один символ (который является символьным кодом00E5
, а не0061
на модификатор,030A
который выглядел бы одинаково) наa
некоторый вид модификатора, а затем преобразование ASCII удаляет модификатор, оставляя единственныйa
.источник
Мне очень нравится лаконичный и функциональный код, предоставляемый azrafe7 . Итак, я немного изменил его, чтобы преобразовать в метод расширения:
источник
Не имея достаточной репутации, видимо, не могу прокомментировать отличную ссылку Александра. - Lucene, похоже, является единственным решением, работающим в достаточно общих случаях.
Для тех, кто хочет простое решение копирования-вставки, вот оно, используя код в Lucene:
строка испытательного стенда = "ÁÂÄÅÇÉÍÎÓÖØÚÜÞàáâãäåæçèéêëìíîïðñóôöøúüāăčĐęğıŁłńŌōřŞşšźžșțệủ";
ЕЫпе (Lucene.latinizeLucene (стендовый));
//////////
источник