【问题标题】:How can I remove accents on a string?如何删除字符串上的重音符号?
【发布时间】:2010-08-26 19:07:01
【问题描述】:

我有以下字符串

áéíóú

我需要将其转换为

aeiou

我怎样才能实现它? (我不需要比较,我需要新的字符串来保存)

【问题讨论】:

  • 我正在寻找可以去除重音符号,但将所有外来字母保留为 Unicode 的解决方案。 IE。我需要将 'á' 转换为 'a',但不要触摸 'я' 或 'жопа'

标签: sql-server


【解决方案1】:

尝试使用COLLATE

select 'áéíóú' collate SQL_Latin1_General_Cp1251_CS_AS

对于 Unicode 数据,请尝试以下操作:

select cast(N'áéíóú' as varchar(max)) collate SQL_Latin1_General_Cp1251_CS_AS

我不确定在使用第二种方法时您可能会在翻译中丢失什么。

更新

看来œ是个特例,大小写要分开处理。您可以这样做(此代码非常适合用户定义函数):

declare @str nvarchar(max) = N'ñaàeéêèioô; Œuf un œuf'
select cast(
    replace((
        replace(@str collate Latin1_General_CS_AS, 'Œ' collate Latin1_General_CS_AS, 'OE' collate Latin1_General_CS_AS) 
    ) collate Latin1_General_CS_AS, 'œ' collate Latin1_General_CS_AS, 'oe' collate Latin1_General_CS_AS) as varchar(max)
) collate SQL_Latin1_General_Cp1251_CS_AS 
-- Output:
-- naaeeeeioo; Oeuf un oeuf

用户定义函数

create function dbo.fnRemoveAccents(@str nvarchar(max))  
returns varchar(max) as
begin
return cast(
    replace((
        replace(@str collate Latin1_General_CS_AS, 'Œ' collate Latin1_General_CS_AS, 'OE' collate Latin1_General_CS_AS) 
    ) collate Latin1_General_CS_AS, 'œ' collate Latin1_General_CS_AS, 'oe' collate Latin1_General_CS_AS) as varchar(max)
) collate SQL_Latin1_General_Cp1251_CS_AS 
end

【讨论】:

  • 仅适用于非 unicode 列。即,不适用于N'áéíóú'
  • 我正在寻找可以去除重音符号,但将所有外来字母保留为 Unicode 的解决方案。 IE。我需要将 'á' 转换为 'a',但不要触摸 'я' 或 'жопа'
  • @MikeKeskinov 这最好作为一个新问题提出
  • 请注意:由于整理,此演员表会弄乱不区分大小写的查询,请确保您解决了这个问题
  • 这些解决方案不适用于“bœuf”这个词。 SELECT cast(N'bœuf' as varchar(max)) collate SQL_Latin1_General_CP1253_CI_AI。结果是“b?uf”。我在测试编码时总是使用那些“–”字母,因为它们经常破坏一切......
【解决方案2】:

有时,字符串可以有另一个 COLLATION,因此结果中仍然有重音符号。在这种情况下,您可以使用此行 (based on this solution here):

SELECT convert(varchar, your_string) COLLATE SQL_Latin1_General_Cp1251_CS_AS;

【讨论】:

    【解决方案3】:

    使用翻译功能:

    SELECT TRANSLATE(
    N'INPUT: ïÜ×ÌùµŪč©īĐÃÙěÓńÿâŘåòÔÕłćýçÀŻūìóèůüíÄûØõäÕťżîŃà£êřßøŽÖáďÉęúÂĪāËžŮōÑÇĆź®Š¥ĘĒśŹĚŚšŸ¢ŁéąÈđÆÍÛĄÝĎēČÊŌŇöÏňëÎæãŤñÒÚĀÅÁô',
    N'ÁÀÂÃÄÅàáâãäåĀāąĄæÆÇçćĆčČ¢©đĐďĎÈÉÊËèéêëěĚĒēęĘÌÍÎÏìíîïĪīłŁ£ÑñňŇńŃÒÓÔÕÕÖØòóôõöøŌōřŘ®ŠšśŚßťŤÙÚÛÜùúûüůŮŪūµ×¥ŸÿýÝŽžżŻźŹ', 
    N'aaaaaaaaaaaaaaaaaaccccccccddddeeeeeeeeeeeeeeiiiiiiiiiilllnnnnnooooooooooooooooorrsssssttuuuuuuuuuuuuuxyyyyyzzzzzz');
    
    -- OUTPUT: 'INPUT: iuxiuuuccidaueonyaraooolcycazuioeuuiauooaotzioaleosozoadeeuaiaezuoncczrsyeeszessycleaedaiuaydeceonoineiaatnouaaao'
    

    查看此链接以查找更多“类似”字符:

    https://github.com/apache/lucene-solr/blob/1ca7067a810578d4e246b5434b9cdcec7145d230/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilter.java#L189

    【讨论】:

      【解决方案4】:

      我遇到了同样的问题。在希腊语中,要正确转换为 UPPER(),您必须抑制重音。更改排序规则会导致其他应用程序出现问题。放置一些 REPLACE() 函数,我可以更好地控制维护排序规则的行为。下面是我的 ToUpperCaseGR 函数。

          SET ANSI_NULLS ON
          GO
          SET QUOTED_IDENTIFIER ON
          GO
      
          create FUNCTION ToUpperCaseGR
          (
           @word nvarchar(max)
          )
          RETURNS nvarchar(max)
          AS
          BEGIN
              -- Declare the return variable here
              declare @res nvarchar(max)
              set @res = UPPER(@word)
              set @res = replace(@res,'Ά','Α')
              set @res = replace(@res,'Έ','Ε')
              set @res = replace(@res,'Ί','Ι')
              set @res = replace(@res,'Ή','Η')
              set @res = replace(@res,'Ό','Ο')
              set @res = replace(@res,'Ύ','Υ')
              set @res = replace(@res,'Ώ','Ω')
      
      
              -- Return the result of the function
              RETURN @res
      
          END
          GO
      

      【讨论】:

      • 整理对我不起作用,但这个是绝对安全的。
      【解决方案5】:

      使用此功能:

      CREATE FUNCTION [dbo].[F_RemoveDiacritics] (
       @String varchar(max)
      )   RETURNS varchar(max)
      
      AS BEGIN
      DECLARE @StringResult VARCHAR(max);
      
      select @StringResult= @String collate SQL_Latin1_General_Cp1251_CS_AS
      
      return @StringResult
      
      
      END
      

      【讨论】:

        猜你喜欢
        • 2015-08-30
        • 2010-09-19
        • 2012-12-10
        • 2012-01-21
        • 1970-01-01
        • 2014-12-11
        • 2010-11-04
        • 2022-01-03
        相关资源
        最近更新 更多