Estoy tratando de convertir algunas cadenas que están en francés canadiense y, básicamente, me gustaría poder eliminar los acentos franceses en las letras mientras mantengo la letra. (Por ejemplo, convertir é
a e
, entonces crème brûlée
se convertiría encreme brulee
)
¿Cuál es el mejor método para lograr esto?
.net
string
diacritics
James Hall
fuente
fuente
Respuestas:
No he usado este método, pero Michael Kaplan describe un método para hacerlo en su publicación de blog (con un título confuso) que habla sobre diacríticos de stripping: Stripping es un trabajo interesante (también conocido como el significado de caracteres sin sentido, también conocidos como All Mn no son espaciados, pero algunos son más espaciados que otros)
Tenga en cuenta que este es un seguimiento de su publicación anterior: Despojar diacríticos ...
El enfoque utiliza String. Normalizar para dividir la cadena de entrada en glifos constituyentes (básicamente separando los caracteres "base" de los diacríticos) y luego escanea el resultado y retiene solo los caracteres base. Es un poco complicado, pero realmente estás viendo un problema complicado.
Por supuesto, si se limita al francés, probablemente podría salirse con la suya con el método simple basado en tablas en Cómo eliminar acentos y tildes en una cadena C ++ std :: , como lo recomienda @David Dibben.
fuente
esto me sirvió ...
rápido y corto!
fuente
«
»
y…
(como un solo carácter) se alterarán en el proceso, que no es el caso con la solución aceptada.System.ArgumentException: 'ISO-8859-8' is not a supported encoding name.
System.Text.Encoding.CodePages
desde nuget, luego llame para registrar el proveedor:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- una vez que haya hecho esto, puede usar ISO-8859-8En caso de que alguien esté interesado, estaba buscando algo similar y terminé escribiendo lo siguiente:
fuente
c < 128
asegurarnos de no recoger ningún carácter UTF, consulte aquí .c < 123
. ver ASCINecesitaba algo que convierta todos los caracteres Unicode principales y la respuesta votada dejó algunos, así que he creado una versión de CodeIgniter
convert_accented_characters($str)
en C # que es fácilmente personalizable:Uso
fuente
if (entry.Key.IndexOf(c) != -1)
enif (entry.Key.Contains(c))
{ "äæǽ", "ae" }
lugar de{ "ä", "ae" }, { "æ", "ae" }, { "ǽ", "ae" }
simplemente llamarif (foreign_characters.TryGetValue(...)) ...
. Has derrotado por completo el propósito del índice que el diccionario ya tiene.En caso de que alguien esté interesado, aquí está el equivalente de Java:
fuente
A menudo uso un método de extensión basado en otra versión que encontré aquí (vea Reemplazar caracteres en C # (ascii) ) Una explicación rápida:
Código:
fuente
La página de códigos del griego (ISO) puede hacerlo
La información sobre esta página de códigos está en
System.Text.Encoding.GetEncodings()
. Aprende sobre en: https://msdn.microsoft.com/pt-br/library/system.text.encodinginfo.getencoding(v=vs.110).aspxEl griego (ISO) tiene la página de códigos 28597 y el nombre iso-8859-7 .
Ve al código ... \ o /
Entonces, escribe esta función ...
Tenga en cuenta que ...
Encoding.GetEncoding("iso-8859-7")
es equivalente aEncoding.GetEncoding(28597)
porque primero es el nombre y segundo la página de códigos de Codificación.fuente
äáčďěéíľľňôóřŕšťúůýž ÄÁČĎĚÉÍĽĽŇÔÓŘŔŠŤÚŮÝŽ ÖÜË łŁđĐ ţŢşŞçÇ øı
) Los problemas se encontraron solo conßə
, que se convierten a?
, pero tales excepciones siempre se pueden manejar por separado. Antes de poner esto en producción, la prueba debe hacerse mejor contra todas las áreas Unicode que contienen letras con signos diacríticos.Es curioso que una pregunta así pueda obtener tantas respuestas y, sin embargo, ninguna se ajusta a mis requisitos :) Hay tantos idiomas, una solución agnóstica de idioma completo es AFAIK realmente imposible, ya que otros han mencionado que el FormC o el FormD están dando problemas.
Como la pregunta original estaba relacionada con el francés, la respuesta de trabajo más simple es
1251 debe ser reemplazado por el código de codificación del idioma de entrada.
Sin embargo, esto reemplaza solo un carácter por un carácter. Como también estoy trabajando con el alemán como entrada, hice una conversión manual
Puede que no ofrezca el mejor rendimiento, pero al menos es muy fácil de leer y ampliar. Regex es un NO GO, mucho más lento que cualquier cosa de char / string.
También tengo un método muy simple para eliminar espacio:
Finalmente, estoy usando una combinación de las 3 extensiones anteriores:
Y una pequeña prueba de unidad para eso (no exhaustiva) que pasa con éxito.
fuente
Esto funciona bien en Java.
Básicamente, convierte todos los caracteres acentuados en sus contrapartes desacentuados, seguidos de su combinación de signos diacríticos. Ahora puede usar una expresión regular para quitar los signos diacríticos.
fuente
"\\p{Block=CombiningDiacriticalMarks}"
TL; DR - Método de extensión de cadena C #
Creo que la mejor solución para preservar el significado de la cadena es convertir los caracteres en lugar de despojarlos, lo cual está bien ilustrado en el ejemplo
crème brûlée
acrme brle
vs.creme brulee
.Revisé el comentario de Alexander anterior y vi que el código Lucene.Net tiene licencia Apache 2.0, así que modifiqué la clase en un método simple de extensión de cadena. Puedes usarlo así:
La función es demasiado larga para publicar en una respuesta StackOverflow (~ 139k caracteres de 30k permitidos jajaja), así que hice una idea general y atribuí a los autores :
Espero que ayude a alguien más, ¡esta es la solución más sólida que he encontrado!
fuente
ESTA ES LA VERSIÓN VB (Funciona con GRIEGO):
Sistema de Importaciones. Texto
Sistema de importaciones Globalización
fuente
Prueba el paquete HelperSharp .
Hay un método RemoveAccents:
fuente
Así es como reemplazo los caracteres diacríticos por caracteres no diacríticos en todo mi programa .NET
C#:
VB .NET:
fuente
puede usar la extensión de cadena del paquete nuget MMLib.Extensions:
Página de Nuget: https://www.nuget.org/packages/MMLib.Extensions/ Sitio del proyecto Codeplex https://mmlib.codeplex.com/
fuente
Haciendo estallar esta biblioteca aquí si aún no lo ha considerado. Parece que hay una gama completa de pruebas unitarias con él.
https://github.com/thomasgalliker/Diacritics.NET
fuente
fuente
Lo que dijo esta persona:
Encoding.ASCII.GetString(Encoding.GetEncoding(1251).GetBytes(text));
En realidad, divide los gustos de
å
un carácter (que es el código de carácter00E5
, no0061
más el modificador030A
que se vería igual) ena
más algún tipo de modificador, y luego la conversión ASCII elimina el modificador, dejando el únicoa
.fuente
Realmente me gusta el código conciso y funcional proporcionado por azrafe7 . Entonces, lo he cambiado un poco para convertirlo a un método de extensión:
fuente
Al no tener suficientes reputaciones, aparentemente no puedo comentar sobre el excelente enlace de Alexander. - Lucene parece ser la única solución que funciona en casos razonablemente genéricos.
Para aquellos que desean una solución simple de copiar y pegar, aquí está, aprovechando el código en Lucene:
string testbed = "ÁÂÄÅÇÉÍÎÓÖØÚÜÞàáâãäåæçèéêëìíîïðñóôöøúüāăčĐęğıŁłńŌōřŞşšźžșțệủ";
Console.WriteLine (Lucene.latinizeLucene (testbed));
//////////
fuente