我有一个包含特殊字符的字符串,例如:
你好。
据我了解""是一个UTF16字符。
如何删除此""字符串和其他任何不是字符串的UTF8字符?
问题在于.Net和JavaScript将其视为两个有效的UTF8字符:
int cs_len = "".Length; // == 2 - C#
var js_len = "".length // == 2 - javascript
,其中
strIn [0]是55356 UTF8字符==☐
和
strIn [1]是57152 UTF8字符==☐
此外,下一段代码片段会返回相同的结果:
string strIn = "Hello ";
string res;
byte[] bytes = Encoding.UTF8.GetBytes(strIn);
res = Encoding.UTF8.GetString(bytes);
return res;//Hello
和
string res = null;
using (var stream = new MemoryStream())
{
var sw = new StreamWriter(stream, Encoding.UTF8);
sw.Write(strIn);
sw.Flush();
stream.Position = 0;
using (var sr = new StreamReader(stream, Encoding.UTF8))
{
res = sr.ReadToEnd();
}
}
return res;//Hello
我还需要不仅支持英语,还支持中文和日语以及任何其他语言,以及任何其他UTF8字符。如何删除或替换C#或JavaScript代码中的任何UTF16字符,包括sign。
感谢。
答案 0 :(得分:1)
UTF-16和UTF-8"包含"相同数量的"字符" (确切地说:由于David Haim,可能代表一个角色的代码点),唯一的区别是它们如何被编码为字节。
在你的例子""在UTF-16中为3C D8 40 DF
,在UTF-8中为F0 9F 8D 80
。
从您的问题描述和粘贴的字符串中我怀疑您的源代码是用UTF-8编码的,但您的编译器/解释器正在将其读作UTF-16。因此它会将单字符UTF序列F0 9F 8D 80
解释为两个单独的UTF-16字符F0 9f
和8D 80
- 第一个是无效的unicode字符,第二个是& #34; Han Character"。
至于如何解决问题:
在您的示例中,您应该查看用于创建源的编辑器,它使用哪种编码来保存文件,还应检查是否可以将编码指定为编译器选项。
您还应该意识到,一旦您不使用硬编码的字符串文字但是从文件或网络读取您的输入,情况会有所不同 - 您在阅读时必须处理编码问题输入
答案 1 :(得分:0)
我找到了我的问题的解决方案,它没有涵盖所有utf-16字符,但删除了其中许多字符:
var title =
title.replace(/([\uE000-\uF8FF]|\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDDFF])/g, '*');
在这里,我用“明星”*
替换所有特殊字符。您还可以放置一个空字符串''
来删除它们。
字符串末尾的/g
的含义是删除所有出现的这些特殊字符,因为没有它,string.replace(...)可能只删除第一个。