Estou tentando converter algumas strings que estão em francês canadense e, basicamente, eu gostaria de poder tirar o sotaque francês nas letras, mantendo a letra. (Por exemplo, converter é
para e
, então crème brûlée
se tornaria creme brulee
)
Qual é o melhor método para conseguir isso?
.net
string
diacritics
James Hall
fonte
fonte
Respostas:
Eu não usei esse método, mas Michael Kaplan descreve um método para fazê-lo em sua postagem no blog (com um título confuso) que fala sobre descartar diacríticos: descascar é um trabalho interessante (também conhecido como sobre o significado de sem sentido, também conhecido como todos os personagens de Mn) são sem espaçamento, mas alguns são mais espaçadores que outros)
Observe que este é um acompanhamento de seu post anterior: Removendo diacríticos ....
A abordagem usa String.Normalize para dividir a sequência de entrada em glifos constituintes (basicamente separando os caracteres "base" dos diacríticos) e depois varre o resultado e retém apenas os caracteres base. É um pouco complicado, mas na verdade você está vendo um problema complicado.
Obviamente, se você está se limitando ao francês, provavelmente poderá se dar bem com a abordagem simples baseada em tabela em Como remover acentos e til em uma string C ++ std :: , conforme recomendado por @David Dibben.
fonte
isso fez o truque para mim ...
rápido e curto!
fonte
«
»
e…
(como um único caractere) serão alterados no processo, o que não é o caso da solução aceita.System.ArgumentException: 'ISO-8859-8' is not a supported encoding name.
System.Text.Encoding.CodePages
partir do nuget e ligue para registrar o provedor:Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- depois de fazer isso, poderá usar a ISO-8859-8Caso alguém esteja interessado, eu estava procurando algo semelhante e acabei escrevendo o seguinte:
fonte
c < 128
, para garantir que não recebamos nenhum caractere UTF, veja aqui .c < 123
. veja ASCIEu precisava de algo que converta todos os principais caracteres unicode e a resposta votada foi de alguns, por isso criei uma versão do CodeIgniter
convert_accented_characters($str)
em C # que é facilmente personalizável:Uso
fonte
if (entry.Key.IndexOf(c) != -1)
emif (entry.Key.Contains(c))
{ "äæǽ", "ae" }
invés de{ "ä", "ae" }, { "æ", "ae" }, { "ǽ", "ae" }
apenas ligarif (foreign_characters.TryGetValue(...)) ...
. Você derrotou completamente o objetivo do índice que o dicionário já possui.Caso alguém esteja interessado, aqui está o equivalente a java:
fonte
Costumo usar um método de extensão baseado em outra versão que encontrei aqui (consulte Substituindo caracteres em C # (ascii) ). Uma explicação rápida:
Código:
fonte
O CodePage of Greek (ISO) pode fazê-lo
As informações sobre esta página de código estão em
System.Text.Encoding.GetEncodings()
. Saiba mais em: https://msdn.microsoft.com/pt-br/library/system.text.encodinginfo.getencoding(v=vs.110).aspxO grego (ISO) tem a página de código 28597 e o nome iso-8859-7 .
Vá para o código ... \ o /
Então, escreva esta função ...
Observe que ...
Encoding.GetEncoding("iso-8859-7")
é equivalente aEncoding.GetEncoding(28597)
porque primeiro é o nome e depois a página de código de Codificação.fonte
äáčďěéíľľňôóřŕšťúůýž ÄÁČĎĚÉÍĽĽŇÔÓŘŔŠŤÚŮÝŽ ÖÜË łŁđĐ ţŢşŞçÇ øı
) Os problemas foram encontrados apenas com osßə
quais são convertidos?
, mas essas exceções sempre podem ser tratadas de maneira separada. Antes de colocar isso em produção, o teste deve ser melhor realizado em todas as áreas Unicode que contêm letras com sinais diacríticos.É engraçado que essa pergunta possa obter tantas respostas, e mesmo assim nenhuma atenda aos meus requisitos :) Existem tantos idiomas por aí, uma solução independente de idioma é o AFAIK realmente não é possível, pois outros mencionaram que o FormC ou FormD estão dando problemas.
Como a pergunta original estava relacionada ao francês, a resposta mais simples de trabalho é de fato
1251 deve ser substituído pelo código de codificação do idioma de entrada.
No entanto, isso substitui apenas um caractere por um caractere. Como também estou trabalhando com o alemão como entrada, fiz uma conversão manual
Pode não oferecer o melhor desempenho, mas pelo menos é muito fácil de ler e estender. Regex é um NO GO, muito mais lento que qualquer material de char / string.
Eu também tenho um método muito simples para remover espaço:
Eventualmente, estou usando uma combinação das três extensões acima:
E um pequeno teste de unidade para aquele (não exaustivo) que passa com sucesso.
fonte
Isso funciona bem em java.
Basicamente, converte todos os caracteres acentuados em seus equivalentes descentralizados, seguidos pelos diacríticos combinados. Agora você pode usar um regex para remover os sinais diacríticos.
fonte
"\\p{Block=CombiningDiacriticalMarks}"
TL; DR - método de extensão de string C #
Eu acho que a melhor solução para preservar o significado da cadeia é para converter os caracteres em vez de desnudar-los, o que é bem ilustrado no exemplo
crème brûlée
acrme brle
vs.creme brulee
.Verifiquei o comentário de Alexander acima e vi que o código Lucene.Net é licenciado para Apache 2.0, então modifiquei a classe em um método simples de extensão de string. Você pode usá-lo assim:
A função é muito longa para postar em uma resposta do StackOverflow (~ 139k caracteres de 30k permitidos), então criei uma essência e atribuí os autores :
Espero que ajude alguém, esta é a solução mais robusta que encontrei!
fonte
ESTA É A VERSÃO VB (Funciona com o grego):
Importação System.Text
Importação System.Globalization
fonte
Experimente o pacote HelperSharp .
Existe um método RemoveAccents:
fonte
É assim que substituo caracteres diacríticos por caracteres não diacríticos em todo o meu programa .NET
C #:
VB .NET:
fonte
você pode usar a extensão de seqüência de caracteres do pacote de nuget MMLib.Extensions:
Página Nuget: https://www.nuget.org/packages/MMLib.Extensions/ Site do projeto Codeplex https://mmlib.codeplex.com/
fonte
Popping esta biblioteca aqui se você ainda não a considerou. Parece que há uma gama completa de testes de unidade com ele.
https://github.com/thomasgalliker/Diacritics.NET
fonte
fonte
O que essa pessoa disse:
Encoding.ASCII.GetString(Encoding.GetEncoding(1251).GetBytes(text));
Na verdade, ele divide os gostos de
å
um caractere (que é o código de caractere00E5
, e não0061
o modificador030A
que teria a mesma aparência) ema
algum tipo de modificador, e a conversão ASCII remove o modificador, deixando o únicoa
.fonte
Eu realmente gosto do código conciso e funcional fornecido pelo azrafe7 . Então, eu mudei um pouco para convertê-lo em um método de extensão:
fonte
Não tendo reputação suficiente, aparentemente não posso comentar sobre o excelente link de Alexander. - Lucene parece ser a única solução funcionando em casos razoavelmente genéricos.
Para aqueles que desejam uma solução simples de copiar e colar, aqui está, aproveitando o código no Lucene:
string testbed = "ÁÂÄÅÇÉÍÎÓÖØÚÜÞàáâãäåæçèéêëìíîïðñóôöøúüāăčĐęğıŁłńŌōřŞşšźžșțệủ";
Console.WriteLine (Lucene.latinizeLucene (testbed));
//////////
fonte