我有两个字符串.
一个是"\""
另一个是"\""
我认为他们是一样的.
然而,String.Compare
他们说是不同的.
这很奇怪.
这是我的代码:
string b = "\"";
string c = "\"";
if (string.Compare(b, c) == 0)
{
Console.WriteLine("Good");
}
if (c.StartsWith("\""))
{
Console.WriteLine("C");
}
if (b.StartsWith("\""))
{
Console.WriteLine("B");
}
Run Code Online (Sandbox Code Playgroud)
我预计它可能会打印"GoodCB".
但是,它只打印"B".
在我的调试器中,c[0]
是65279''并且c[1]
是34'''.并且b[0]
是'''.
但我不知道65279'是什么.
这是一个空洞的角色吗?
我正在使用最近添加了Unicode BOM头(U + FEFF)的数据源,而我的rake任务现在被它搞砸了.
我可以跳过前3个字节,file.gets[3..-1]
但有没有更优雅的方式来读取Ruby中的文件,无论BOM是否存在,都能正确处理?
我有一个HTTPHandler,它读取一组CSS文件并将它们组合起来然后GZipping它们.但是,一些CSS文件包含一个字节顺序标记(由于TFS 2005自动合并中的一个错误),而在FireFox中,BOM被作为实际内容的一部分被读取,因此它搞砸了我的类名等.我怎样才能剥离出BOM字符?有没有一种简单的方法可以在没有手动浏览字节数组的情况下查找""?
编辑:我原本以为这与.NET Framework 4.5有关.原来它也适用于.NET Framework 4.0.
Windows Server 2012中的字符串处理方式发生了变化,我试图更好地理解它.似乎StartsWith的行为已经改变.使用.NET Framework 4.0和4.5可以重现该问题.
使用Windows 7上的.NET Framework 4.5,下面的程序打印"False,t".在Windows 2012 Server上,它会打印"True,t".
internal class Program
{
private static void Main(string[] args)
{
string byteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
Console.WriteLine("test".StartsWith(byteOrderMark));
Console.WriteLine("test"[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,无论字符串内容如何,StartsWith(ByteOrderMark)都返回true.如果您有使用以下方法尝试剥离字节顺序标记的代码,此代码将在Windows 7上正常工作,但将在Windows 2012上打印"est".
internal class Program
{
private static void Main(string[] args)
{
string byteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
string someString = "Test";
if (someString.StartsWith(byteOrderMark))
someString = someString.Substring(1);
Console.WriteLine("{0}", someString);
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
}
我意识到如果你在字符串中有字节顺序标记,你已经做错了,但我们正在与具有此功能的遗留代码集成.我知道我可以通过以下方式解决这个具体问题,但我想更好地理解这个问题.
someString = someString.Trim(byteOrderMark[0]);
Run Code Online (Sandbox Code Playgroud)
Hans Passsant建议使用UTF8Encoding的构造函数,它允许我明确地告诉它发出UTF8标识符.我尝试了这个,但它给出了相同的结果.以下代码在Windows 7和Windows Server 2012之间的输出方面有所不同.在Windows 7上,它打印"Result:False".在Windows Server 2012上,它打印"Result:True".
private static void …
Run Code Online (Sandbox Code Playgroud) 我需要编写一个由Web服务使用的XML片段.任何xml声明都会导致Web服务拒绝该请求.为了支持这一点,我有以下课程:
public class ContentQueryCriteria
{
public int Type { get; set; }
public string Value { get; set; }
public int Condition { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这允许我设置请求标准,然后得到结果.
代码使用如下:
ContentQueryCriteria content = new ContentQueryCriteria();
content.Type = 1;
content.Value = "NAVS500";
content.Condition = 1;
string requestBody = SerializeToString(content);
Console.WriteLine(requestBody);
Run Code Online (Sandbox Code Playgroud)
当我将其序列化为XML文件时,我得到了正确的响应,没有XML声明或任何名称空间.但是,我宁愿捕获内存流中的数据,而不是文件.
使用以下方法(取自http://www.codeproject.com/Articles/58287/XML-Serialization-Tips-Tricks)我能够取得成果,但出于某种原因,我有一个?列为字符串的一部分.
public static string SerializeToString(object obj)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
MemoryStream ms = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings(); …
Run Code Online (Sandbox Code Playgroud) 我正在从.csv文件中大量上传信息,我需要将此字符替换为ascii"�"以获取正常空间"".
对于C/C++/JAVA,字符"�"对应于"\ uFFFD",它似乎称为REPLACEMENT CHARACTER.其他如C#官方文档中的空格类型如U + FEFF,205F,200B,180E,202F.
我正在尝试以这种方式替换
public string Errors="";
public void test(){
string textFromCsvCell= "";
string validCharacters="^[0-9A-Za-z().:%-/ ]+$";
textFromCsvCell="This is my text from csv file"; //ALl spaces aren't normal space " "
string cleaned = textFromCsvCell.Replace("\uFFFD", "\"")
if (Regex.IsMatch(cleaned, validCharacters ))
//All code for insert
else
Errors=cleaned;
//print Errors
}
Run Code Online (Sandbox Code Playgroud)
测试方法给我看这个文字:
"这是来自csv文件的my�texto"
我尝试了一些解决方案
尝试解决方案1:使用修剪
Regex.Replace(value.Trim(), @"[^\S\r\n]+", " ");
Run Code Online (Sandbox Code Playgroud)
尝试解决方案2:使用替换
System.Text.RegularExpressions.Regex.Replace(str,@"\s+"," ");
Run Code Online (Sandbox Code Playgroud)
尝试解决方案3:使用修剪
String.Trim(new char[]{'\uFEFF','\u200B'});
Run Code Online (Sandbox Code Playgroud)
尝试解决方案4:将[\ S\r \n]添加到validCharacters
string validCharacters="^[\S\r\n0-9A-Za-z().:%-/ ]+$";
Run Code Online (Sandbox Code Playgroud)
什么都行不通
有人有想法吗?我怎样才能更换它?我非常感谢你的帮助,谢谢
资料来源:
http://www.fileformat.info/info/unicode/char/0fffd/index.htm