AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 83934
Accepted
Decrypted
Decrypted
Asked: 2014-11-30 18:52:49 +0800 CST2014-11-30 18:52:49 +0800 CST 2014-11-30 18:52:49 +0800 CST

Como remover os acentos hebraicos

  • 772

Preciso de um truque de codificação de caracteres para remover marcas de sotaque hebraico.

Amostra antes

בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ

Amostra Depois

בראשית ברא אלהים את השמים ואת הארץ

sql-server collation
  • 4 4 respostas
  • 1909 Views

4 respostas

  • Voted
  1. Best Answer
    Solomon Rutzky
    2014-12-05T00:04:42+08:002014-12-05T00:04:42+08:00

    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 osandró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

    • cantilação (como deve ser cantada)

    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 disse Deus: "Que as águas sejam recolhidas"
    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:

    SELECT DATALENGTH(N'מַ֖'); -- character taken from original given text
    

    Retorna:

    6
    

    não 2como a maioria das pessoas esperaria ao ver um único caractere de byte duplo. Então, talvez tentemos descobrir qual personagem está lá fazendo:

    SELECT UNICODE(N'מַ֖');
    

    que retorna:

    1502
    

    Obviamente, as funções UNICODEe ASCIIretornam apenas o INTvalor 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:

    SELECT NCHAR(1502), CONVERT(BINARY(2), UNICODE(N'מַ֖')), CONVERT(VARBINARY(10), N'מַ֖');
    

    Nós temos:

    מ
    0x05DE  0xDE05B7059605
    

    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?

    SELECT REPLACE(N'מַ֖' COLLATE Hebrew_BIN2, NCHAR(1502) COLLATE Hebrew_BIN2, '');
    

    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 REPLACEpara 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:

    CREATE FUNCTION dbo.RemoveHebrewAccents (@txeTwerbeH NVARCHAR(MAX))
    RETURNS NVARCHAR(MAX)
    WITH SCHEMABINDING
    AS
    BEGIN
    
      WITH base (dummy) AS
      (
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
      ), nums AS
      (
        -- we will want to generate code points 1425 - 1479
        SELECT TOP (55) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [Num]
        FROM   base b1
        CROSS JOIN base b2
      )
      SELECT @txeTwerbeH = REPLACE(
                                   @txeTwerbeH COLLATE Hebrew_BIN2,
                                   NCHAR(1424 + nums.[Num]) COLLATE Hebrew_BIN2,
                                   ''
                                  )
      FROM   nums;
    
      RETURN @txeTwerbeH;
    END;
    

    E então podemos testá-lo com o texto original da seguinte forma:

    DECLARE @Hebrew NVARCHAR(200) = N'בְּרֵאשִׁ֖ית בָּרָ֣א אֱלֹהִ֑ים אֵ֥ת הַשָּׁמַ֖יִם וְאֵ֥ת הָאָֽרֶץ';
    
    SELECT dbo.RemoveHebrewAccents(@Hebrew);
    

    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_SCnão combinava com eles. Mas o seguinte funcionou: Hebrew_BIN, Hebrew_BIN2, Latin1_General_BINe Latin1_General_BIN2. Na função acabei usando Hebrew_BIN2. Observe que, ao usar agrupamentos binários, a menos que você tenha uma necessidade específica de usar os _BINagrupamentos mais antigos, você deve usar apenas os _BIN2agrupamentos 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"):

      No início da criação de Deus os céus e a Terra

    • 19/01/2015: Encontrei alguns ótimos recursos que explicam a combinação de caracteres e o conjunto de caracteres hebraicos:

      • http://en.wikipedia.org/wiki/Combining_character (também vinculado ao topo desta resposta)
      • http://www.alanwood.net/unicode/combining_diacritical_marks.html
      • http://www.alanwood.net/unicode/hebrew.html
      • http://people.w3.org/rishida/scripts/pickers/hebrew/ (jogue com todos os caracteres do conjunto de caracteres hebraicos; muito legal!)
    • 26
  2. Erik Darling
    2014-12-03T14:53:28+08:002014-12-03T14:53:28+08:00

    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:

    SET NOCOUNT ON  
    
    DECLARE @cnt INT = 1
    DECLARE @sqlcmd NVARCHAR(512) = ''
    
    CREATE TABLE #CHARS (
    [CharOrder] INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    [Result] NVARCHAR(4) 
    )
    
    WHILE @cnt < 65536
    BEGIN
    
    SELECT @sqlcmd = '
    INSERT #CHARS
        ([Result] )
    SELECT NCHAR(' + CAST(@cnt AS NVARCHAR) + ')
    '
    
    EXEC sys.sp_executesql @sqlcmd
    
    SET @cnt +=1 
    END
    

    Em seguida, localizei um dos caracteres não acentuados:

    SELECT  c.CharOrder, c.Result
    FROM    #CHARS AS c
    WHERE c.Result = N'ר'
    ORDER BY c.CharOrder
    

    Em seguida, localizei o intervalo de caracteres em que os caracteres hebraicos estão:

    SELECT  c.CharOrder, c.Result
    FROM    #CHARS AS c
    WHERE c.CharOrder >= 1488
    AND c.CharOrder < 1523
    ORDER BY c.CharOrder
    

    Mas tentando encontrar os caracteres acentuados que você deseja, eles não parecem aparecer, exceto um hit no código 8501.

    SELECT  c.CharOrder ,
            c.Result
    FROM    #CHARS AS c
    WHERE   c.Result IN ( N'רֵ', N'א', N'שִׁ֖', N'י', N'ת', N'בְּ', N'בָּ', N'רָ֣',
                          N'א', N'אֱ', N'לֹ', N'הִ֑', N'י', N'ם', N'אֵ֥', N'ת',
                          N'הַ', N'שָּׁ', N'מַ֖', N'יִ', N'ם', N'וְ', N'אֵ֥', N'ת',
                          N'הָ', N'אָֽ', N'רֶ', N'ץ' )
    ORDER BY c.CharOrder
    

    Então, olhando apenas para os caracteres ao redor, não consigo identificar nenhuma outra correspondência com o seu texto.

    SELECT  c.CharOrder, c.Result
    FROM    #CHARS AS c
    WHERE c.CharOrder >= 8499
    AND c.CharOrder < 8539
    ORDER BY c.CharOrder
    

    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.

    • 1
  3. Michael Green
    2014-12-04T14:22:38+08:002014-12-04T14:22:38+08:00

    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 nvarchare definir suas traduções como N'x', é claro.

    Obrigado a esta postagem pela dica de concatenação de linha.

    drop table #Numbers;
    
    select
        *
    into #Numbers
    from 
        (
        select *
        from (values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) as T(N)
        ) as xx;
    
    drop table #Lookups;
    
    select
        *
    into #Lookups
    from 
        (
        select *
        from (values ('a','m'),('b','n'),('c','o'),('d','p'),('e','q'),('m','z')) as T(CharFrom,CharTo)
        ) as xx;
    
    
    drop table #Inputs;
    
    select
        *
    into #Inputs
    from 
        (
        select *
        from (values ('abcdefghi')
                    ,('abtcd')
            ) as T(Word)
        ) as xx;
    
    
    select
         ix.Word as Original
        ,(
        select
            Coalesce(l.CharTo, SUBSTRING(i.word, n.N, 1)) -- do not alias
        from #Inputs as i
        cross apply #Numbers as n
        left join #Lookups as l
            on l.CharFrom = SUBSTRING(i.word, n.N, 1)
        where n.N <= LEN(i.Word)
        and i.Word = ix.Word
        for xml path ('')
        ) as Substituted
    from #Inputs as ix;
    
    • 0
  4. Decrypted
    2017-06-27T03:14:04+08:002017-06-27T03:14:04+08:00

    Aqui está o que funcionou se alguém no futuro quiser.

    function accentHebrewToCleanHebrew($accentHebrew){ //Strip Extras $search = array("&#1425;", "&#1426;", "&#1427;", "&#1428;", "&#1429;", "&#1430;", "&#1431;", "&#1432;", "&#1433;", "&#1434;", "&#1435;", "&#1436;", "&#1437;", "&#1438;", "&#1439;", "&#1440;", "&#1441;", "&#1442;", "&#1443;", "&#1444;", "&#1445;", "&#1446;", "&#1447;", "&#1448;", "&#1449;", "&#1450;", "&#1451;", "&#1452;", "&#1453;", "&#1454;", "&#1455;", "&#1456;", "&#1457;", "&#1458;", "&#1459;", "&#1460;", "&#1461;", "&#1462;", "&#1463;", "&#1464;", "&#1465;", "&#1466;", "&#1467;", "&#1468;", "&#1469;", "&#1470;", "&#1471;", "&#1472;", "&#1473;", "&#1474;", "&#1475;", "&#1476;", "&#1477;", "&#1478;", "&#1479;"); $replace = ""; $cleanHebrew = str_replace($search, $replace, $accentHebrew); return $cleanHebrew; }

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve