Preciso de um truque de codificação de caracteres para remover marcas de sotaque hebraico.
Amostra antes
בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ
Amostra Depois
בראשית ברא אלהים את השמים ואת הארץ
Preciso de um truque de codificação de caracteres para remover marcas de sotaque hebraico.
Amostra antes
בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ
Amostra Depois
בראשית ברא אלהים את השמים ואת הארץ
O truque aqui é perceber que esses caracteres que você vê na pergunta com os "acentos" não são realmente os caracteres (ou seja, "Estes não são os
andróidescaracteres que você está procurando" ;-) ). Os "acentos" são vários tipos de notações que indicam coisas como:vogais (linhas e pontos que normalmente estão sob as letras):
letra base "ה" = "h"; "הֶ" = "heh" e "הָ" = "hah"
pronúncia (pontos que geralmente estão dentro ou acima das letras):
"בּ" = "b" vs "ב" = "v", ou "שׂ" = "s" vs "שׁ" = "sh"
pontuação
As letras hebraicas reais são o que é mostrado na versão simplificada (ou seja, o resultado final do que está sendo solicitado aqui). O que estamos nos referindo aqui como "acentos" são conhecidos como sinais diacríticos. O artigo da Wikipédia sobre diacríticos hebraicos tem muitas informações boas sobre essas marcas, incluindo a seguinte imagem e legenda:
Gn 1:9 E Deus disse: "Que as águas sejam recolhidas". Letras em preto, apontando em vermelho, cantilação em azul
Passar desses caracteres básicos para o que a primeira linha (com as vogais, etc) mostra é uma questão de adicionar um ou mais "acentos". Unicode (UTF-16 no SQL Server, embora a interpretação padrão lide apenas com os pontos de código UCS-2/Basic Multilingual Plane (BMP)) permite que alguns caracteres se sobreponham a outros caracteres não sobrepostos quando adjacentes a eles. Estes são conhecidos como caracteres combinados .
Significado:
Retorna:
não
2
como a maioria das pessoas esperaria ao ver um único caractere de byte duplo. Então, talvez tentemos descobrir qual personagem está lá fazendo:que retorna:
Obviamente, as funções
UNICODE
eASCII
retornam apenas oINT
valor do primeiro caractere de qualquer string fornecida. Mas um valor de 1502 cobre apenas 2 bytes, o que deixa 4 bytes não contabilizados. Olhando para os valores binários/hex do mesmo "caractere" hebraico:Nós temos:
Agora, 0x05DE é a representação hexadecimal de 1502, e o 1502 é apenas o " מ ". A próxima parte pode ser separada em três conjuntos de 2 bytes: DE05 B705 9605 . Agora, os valores de string Unicode são armazenados em Little Endian, o que significa que a ordem dos bytes é invertida. Se trocarmos cada um desses três conjuntos, obtemos:
05DE (o caractere base) 05B7 0596 (os 4 bytes não contabilizados).
OK. Então, o que acontece se removermos esse personagem base?
Isso retorna os dois caracteres restantes (não é fácil ver aqui, então fiz a linha a seguir um cabeçalho para aumentar o tamanho da fonte; você também pode executar o acima
REPLACE
para vê-los):Remover o מ do מַ֖ deixa dois caracteres na parte inferior: ַ֖
Portanto, precisamos remover cada ponto de código individual que é um desses caracteres de combinação "extra" (encontrados em: http://unicode-table.com/en/search/?q=hebrew ) e isso nos deixará com os personagens básicos. Podemos fazer isso através de:
E então podemos testá-lo com o texto original da seguinte forma:
Retorna:
בראשית ברא אלהים את השמים ואת הארץ
Notas Adicionais:
Tecnicamente, há um conjunto de pontos de código entre 64298 e 64334 que possuem algumas vogais e "acentos" de pronúncia embutidos no caractere. Se eles precisarem ser manipulados, pode ser uma segunda etapa na função para fazer uma simples substituição desses caracteres.
Parece que esses pontos de código de acento, pontuação etc. correspondem apenas ao usar um agrupamento binário. Mesmo usando
Hebrew_100_CS_AS_KS_WS_SC
não combinava com eles. Mas o seguinte funcionou:Hebrew_BIN
,Hebrew_BIN2
,Latin1_General_BIN
eLatin1_General_BIN2
. Na função acabei usandoHebrew_BIN2
. Observe que, ao usar agrupamentos binários, a menos que você tenha uma necessidade específica de usar os_BIN
agrupamentos mais antigos, você deve usar apenas os_BIN2
agrupamentos mais recentes.Para quem está curioso, o exemplo de texto hebraico é na verdade Bereishis 1:1 (que também é a primeira palavra do lado direito, já que o hebraico é lido da direita para a esquerda; em inglês seria "Gênesis 1:1", embora que não é uma tradução direta da palavra, apenas o nome do primeiro livro da Torá/Bíblia; a tradução direta é "no princípio"):
19/01/2015: Encontrei alguns ótimos recursos que explicam a combinação de caracteres e o conjunto de caracteres hebraicos:
Este é um problema interessante, e eu meio que enfrentei um tempo atrás trabalhando com personagens japoneses. Eu bati em uma parede de tijolos tentando localizar seus personagens problemáticos, embora eu espere que isso leve você a algum lugar para encontrá-los.
Primeiro, coloquei todos os NCHARs em uma tabela:
Em seguida, localizei um dos caracteres não acentuados:
Em seguida, localizei o intervalo de caracteres em que os caracteres hebraicos estão:
Mas tentando encontrar os caracteres acentuados que você deseja, eles não parecem aparecer, exceto um hit no código 8501.
Então, olhando apenas para os caracteres ao redor, não consigo identificar nenhuma outra correspondência com o seu texto.
Muitos deles parecem ser jogados como aqueles pequenos retângulos nebulosos de qualquer coisa.
Mais uma vez, desculpe, não é uma solução, mas espero que ajude.
Eu usei uma tabela de números. Existem vários posts explicando o que é isso, por que é útil e como obter um de forma eficiente.
Não uso nenhuma funcionalidade interna para converter caracteres acentuados em equivalentes não acentuados. Em vez disso, crio uma lista de pesquisa que você preencherá com as conversões necessárias. Você terá que usar
nvarchar
e definir suas traduções comoN'x'
, é claro.Obrigado a esta postagem pela dica de concatenação de linha.
Aqui está o que funcionou se alguém no futuro quiser.
function accentHebrewToCleanHebrew($accentHebrew){ //Strip Extras $search = array("֑", "֒", "֓", "֔", "֕", "֖", "֗", "֘", "֙", "֚", "֛", "֜", "֝", "֞", "֟", "֠", "֡", "֢", "֣", "֤", "֥", "֦", "֧", "֨", "֩", "֪", "֫", "֬", "֭", "֮", "֯", "ְ", "ֱ", "ֲ", "ֳ", "ִ", "ֵ", "ֶ", "ַ", "ָ", "ֹ", "ֺ", "ֻ", "ּ", "ֽ", "־", "ֿ", "׀", "ׁ", "ׂ", "׃", "ׄ", "ׅ", "׆", "ׇ"); $replace = ""; $cleanHebrew = str_replace($search, $replace, $accentHebrew); return $cleanHebrew; }