C# FileInfo.GetFiles()和特殊字符(重音符号)

C# FileInfo.GetFiles()和特殊字符(重音符号),c#,sql-server,asp.net-mvc,C#,Sql Server,Asp.net Mvc,当我在DB中插入一个字符串,该字符串包含FileInfo.GetFiles()项中的特殊字符作为“a”或“é”,我会得到问题,并用SQL保存拆分的特殊字符。非特殊字符是可以的 例如,“a”变成“a`”,而“e”变成“e`”。有人遇到过这样的麻烦吗 这是密码 DirectoryInfo di = new DirectoryInfo(path); foreach (FileInfo fi in di.GetFiles()) { Logger.LogInfo("Info: " + fi.Name);

当我在DB中插入一个字符串,该字符串包含FileInfo.GetFiles()项中的特殊字符作为“a”或“é”,我会得到问题,并用SQL保存拆分的特殊字符。非特殊字符是可以的

例如,“a”变成“a`”,而“e”变成“e`”。有人遇到过这样的麻烦吗

这是密码

DirectoryInfo di = new DirectoryInfo(path);
foreach (FileInfo fi in di.GetFiles())
{
 Logger.LogInfo("Info: " + fi.Name);
}
基本上,如果字符串是“sárl”,则日志保存为“Info:sa`rl”

当我通过VS断点时,我看到带有“a”的字符串,但当我记录它时,字符被拆分

我的SQL排序规则是Latin CI AS(SQL_Latin1_General_CP1_CI_AS),DB已经拥有了带有特殊字符的字符串,没有问题

谢谢各位

编辑

我在将fi.Name插入最终表格时也遇到问题:

public bool InsertFile(string fileName, Societe company, string remark, PersonnelAM creator)
        {
            string commandText = (@"INSERT INTO [dbo].[TB_DOCSOCIETE_COM] " +
                                    "([IdtSOC] " +
                                    ",[NomDOC] " +
                                   ",[RemDOC] " +
                                   ",[DateDOC] " +
                                   ",[IdtPER]) " +
                                    "VALUES " +
                                   "(@company" +
                                   ",@fileName" +
                                   ",@remark" +
                                   ",@date" +
                                   ",@creator) SELECT @@IDENTITY");

            var identity = CreateCommand(commandText,
                    new SqlParameter("@fileName", DAOHelper.HandleNullValueAndMinDateTime<string>(fileName)),
                    new SqlParameter("@company", DAOHelper.HandleNullValueAndMinDateTime<int>(company.Id)),
                    new SqlParameter("@remark", DAOHelper.HandleNullValueAndMinDateTime<string>(remark)),
                    new SqlParameter("@date", DAOHelper.HandleNullValueAndMinDateTime<DateTime>(DateTime.Now)),
                    new SqlParameter("@creator", DAOHelper.HandleNullValueAndMinDateTime<int>(creator.id))
                     ).ExecuteScalar();

            return int.Parse(identity.ToString()) > 0;
        }
编辑2:

为了明确DB,这三行:

Logger.LogInfo("BL1 " + "sàrl is right saved");
Logger.LogInfo("BL2 " + fi.Name + " is not right saved");
Logger.LogInfo("BL3 " + "sàrl" + " - " + fi.Name + " is not right too!");
在DB中为我提供了该结果:

BL1 sàrl is right saved
BL2 ENTERPRISE Sa`rl - file.pdf is not right saved
BL3 sàrl - ENTERPRISE Sa`rl - file.pdf is not right too!
所以它不是来自DB,而是关于字符串的问题(编码?

varchar(8000)

使列
NVARCHAR
。这不是排序问题。排序规则决定排序顺序和比较规则,而不是存储。对于非unicode列(
varchar
),排序规则用作确定结果代码页的提示。但代码页只会让您了解到这一点,因为显然1字节编码的代码页无法匹配文件系统命名的整个空间,而文件系统命名是基于Unicode的2字节编码

使用Unicode列:
NVARCHAR

如果您想了解自己的经历,只需运行以下命令:

declare @a nvarchar(4000) = NCHAR(0x00E0) +  N'a' + NCHAR(0x0300)
select @a, cast(@a as varchar);

Unicode充满了奇妙的惊喜,比如。您无法从视觉上区分它们,但当您查看实际编码的字节时,它们肯定会显示出来。

显示您的日志代码或告诉我们您使用哪个库进行日志记录。看起来它以分解的形式保存Unicode字符。存储此字符的列的类型是什么,
varchar
nvarchar
?@HansKesting varchar(8000)@CodeCaster我正在使用NLog,但即使我使用SQL进行插入,问题也会出现parameter@CodeCaster请看我的第二次编辑,这应该会有帮助:-)你能再解释一下吗?如果我给记录器一个C#字符串,即“a”+file.Name,“a”正确地保存在DB中,但file.Name已损坏,因此VARCHAR正在保存第一个“a”。CARCHAR可以保存第一个“a”,那么他为什么不将第二个保存在file.Name中呢?我已经解释了一切,包括您描述的所有症状和问题。查看您正在测试的字符的确切Unicode代码(例如,使用
Encoding.Unicode.GetBytes
,然后显示字节)。好的,很抱歉,这是一个帮助人们的网站。您按照我的要求做了吗?查看您正在测试的字符的确切Unicode代码。。。别担心。我看过你的编辑,它比你以前的答案更清楚。我不是吸血鬼,但如果我不理解,其他人也不会理解。我只是想解释一下,因为你给出的修正对于像我这样的科学/理性的人来说太神奇了。。。所以我要感谢你的回答,它解决了这个问题!
declare @a nvarchar(4000) = NCHAR(0x00E0) +  N'a' + NCHAR(0x0300)
select @a, cast(@a as varchar);