如何从字符串中删除UTF16字符?

时间:2016-08-11 11:48:29

标签: javascript c#

我有一个包含特殊字符的字符串,例如:

你好。

据我了解""是一个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。

感谢。

2 个答案:

答案 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 9f8D 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(...)可能只删除第一个。

相关问题