C#中的Arabic_CI_AS到utf8

时间:2017-10-21 10:53:47

标签: c# sql-server utf-8

我在 Sql Server 中有一个数据库,其集合 Arabic_CI_AS ,我需要将一些字符串数据与另一个 Postgres 数据库进行比较 Utf8 字符集。我还使用C#进行转换和放大相比。当字符串只包含一个单词时很容易完成(在这些情况下我应该将'ي'替换为'ی'),但是对于长字符串特殊的'(' charachter有问题。

我无法做到!我尝试了一些建议的解决方案,例如:

var enc = Encoding.GetEncoding(1256);
byte[] encBytes = enc.GetBytes(customer.name);
customer.name = Encoding.UTF8.GetString(encBytes, 0, encBytes.Length);

或:

SELECT cast (name as nvarchar) as NewName 
from Customer

但他们不工作!任何人都可以帮助我吗?

输入和输出示例,请参见右侧的工具提示:

My input & out put is like this

2 个答案:

答案 0 :(得分:0)

也许这可以帮助您动态更改归类

SELECT name  collate SQL_Latin1_General_CP1_CI_AS
from Customer

SELECT name  collate Persian_100_CI_AI
    from Customer

或 你可以在c#side

中试试这个
string _Value=string.Empty;
byte[] enBuff= Encoding.GetEncoding("windows-1256").GetBytes(customer.name);
customer.name= Encoding.GetEncoding("windows-1252").GetString(enBuff);

您也可以选择其他排序规则。 您应该更改许多归类和编码号码以获得想要的结果。

答案 1 :(得分:0)

SQL Server不支持utf-8个字符串。如果您必须处理 plain-latin 以外的字符,强烈建议您使用NVARCHAR代替VARCHAR进行阿拉伯语排序。

许多人认为NVARCHARutf-16VARCHARutf-8。这不是真的!第二个是扩展ASCII 并且在任何情况下都使用1个字节,而utf-8将编码一些具有多个字节的字符。

所以 - 最重要的问题是:为什么?

SQL Server可以将您的字符串转换为NVARCHAR变量,将其转换为字节链并将其重新转换为前一个字符串:

DECLARE @str NVARCHAR(MAX)=N'(نماینده اراک)';

SELECT @str
      ,CAST(@str AS VARBINARY(MAX))
      ,CAST(CAST(@str AS VARBINARY(MAX)) AS NVARCHAR(MAX));

)的问题是 - 很可能! - 当) 从左到右时,您的阿拉伯语字母从右向左。我想将上面查询的结果粘贴到此答案中,但无法将结果)设置为原始位置...您尝试编辑,删除,替换,但是您得到了其他内容...不知何故有趣,但不是编码错误的问题,而是一个有缺陷的编辑......

无论如何,SQL-Server不是你的问题。您必须从SQL-Server读取字符串NVARCHAR。 C#使用unicode字符串而不是整理的1字节字符串。每次转换都有机会破坏你的文字。

如果您的目标(或您向我们展示的工具提示)无法正确显示字符串,那可能完全可以,但编辑器不是......

如果将这样的UTF-8字符串传递回SQL-Server,你就会搞得一团糟......

UTF-8有意义的唯一地方是写入文件或通过小频段传输。如果一个文本包含很多普通的拉丁字符和一些奇怪的字母(比如常见的XML,HTML),你可以节省相当多的磁盘空间或带。使用远东文本,你甚至会夸大你的文字。其中一些字符需要3个甚至4个字节进行编码。

在您的数据库和应用程序中,您应该坚持使用unicode。