Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将Windows1252字符串与UTF-8字符串进行比较

将Windows1252字符串与UTF-8字符串进行比较
EN

Stack Overflow用户
提问于 2014-12-16 10:57:19
回答 2查看 2.8K关注 0票数 2

我的目标是将.NET字符串(Unicode)转换为Windows1252,并在必要时将原始的UTF-8字符串存储在Base64实体中。

例如,转换为1252的字符串“Doena”仍然是“Doena”。

但是,如果您将日语的kanjii for tree (木)转换为1251,您将得到一个问号。

这些是我的测试字符串:

代码语言:javascript
运行
AI代码解释
复制
String doena = "DJ Doena";
String umlaut = "äöüßéèâ";
String allIn = "< ä ß á â & 木 >";

首先,我是这样转换字符串的:

代码语言:javascript
运行
AI代码解释
复制
using (MemoryStream ms = new MemoryStream())
{
    using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
    {
        sw.Write(decoded);
        sw.Flush();
        ms.Seek(0, SeekOrigin.Begin);
        using (StreamReader sr = new StreamReader(ms, Encoding.GetEncoding(1252)))
        {
            encoded = sr.ReadToEnd();
        }
    }
}

问题是,虽然调试字符串比较声称两者确实是相同的,所以简单的==.Equals()是不够的。

这就是我试图找出是否需要base64并生成它的方法:

代码语言:javascript
运行
AI代码解释
复制
private static String GetBase64Alternate(String utf8Text, String windows1252Text)
{
    Byte[] utf8Bytes;
    Byte[] windows1252Bytes;
    String base64;

    utf8Bytes = Encoding.UTF8.GetBytes(utf8Text);
    windows1252Bytes = Encoding.GetEncoding(1252).GetBytes(windows1252Text);
    base64 = null;
    if (utf8Bytes.Length != windows1252Bytes.Length)
    {
        base64 = Convert.ToBase64String(utf8Bytes);
    }
    else
    {
        for(Int32 i = 0; i < utf8Bytes.Length; i++)
        {
            if(utf8Bytes[i] != windows1252Bytes[i])
            {
                base64 = Convert.ToBase64String(utf8Bytes);
                break;
            }
        }
    }
    return (base64);
}

第一个字符串doena完全相同,不产生base64结果

代码语言:javascript
运行
AI代码解释
复制
Console.WriteLine(String.Format("{0} / {1}", windows1252Text, base64Text));

结果:

代码语言:javascript
运行
AI代码解释
复制
DJ Doena /

但是,第二个字符串umlauts在UTF-8中的字节已经是1252年的两倍,因此产生了一个Base64字符串,尽管它似乎没有必要:

代码语言:javascript
运行
AI代码解释
复制
äöüßéèâ / w6TDtsO8w5/DqcOow6I=

第三个做的是它应该做的事情(不再是"木“,而是"?",因此木需要):

代码语言:javascript
运行
AI代码解释
复制
< ä ß á â & ? > / PCDDpCDDnyDDoSDDoiAmIOacqCA+

有什么线索可以帮助我的Base64吸气剂增强( a)性能b)以获得更好的结果?

提前谢谢你。:-)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-16 11:11:54

我不确定我是否完全理解这个问题。但我试过了。)如果我确实正确理解了,此代码将执行您想要的操作:

代码语言:javascript
运行
AI代码解释
复制
static void Main(string[] args)
{
    string[] testStrings = { "DJ Doena", "äöüßéèâ", "< ä ß á â & 木 >" };

    foreach (string text in testStrings)
    {
        Console.WriteLine(ReencodeText(text));
    }
}

private static string ReencodeText(string text)
{
    Encoding encoding = Encoding.GetEncoding(1252);
    string text1252 = encoding.GetString(encoding.GetBytes(text));

    return text.Equals(text1252, StringComparison.Ordinal) ?
        text : Convert.ToBase64String(Encoding.UTF8.GetBytes(text));
}

也就是说,它将文本编码到Windows1252,然后解码回string对象,然后将其与原始对象进行比较。如果比较成功,则返回原始字符串,否则将其编码为UTF8,然后编码为base64。

它产生以下输出:

DJ Doena 埃莱纳 PCDDpCDDnyDDoSDDoiAmIOacqCA+

换句话说,前两个字符串保持不变,而第三个字符串被编码为base64。

票数 3
EN

Stack Overflow用户

发布于 2014-12-16 11:43:55

在第一段代码中,您使用一种编码方式对字符串进行编码,然后使用不同的编码方式对其进行解码。这根本不能给出任何可靠的结果;这相当于用八进制写出一个数字,然后把它读成十进制。对于7以下的数字来说,它似乎很好,但是在那之后,你得到了无用的结果。

GetBase64Alternate方法的问题是,它将一个字符串编码成两个不同的编码,并且假设第一个编码不支持某些字符,如果第二个编码导致了不同的字节集。

比较字节序列并不能告诉您编码是否失败。如果编码失败,则序列将有所不同,但如果编码之间存在编码不同的字符,则序列也会有所不同。

您要做的是确定编码是否对所有字符都有效。您可以通过为不受支持的字符创建一个Encoding实例来实现这一点。您可以为此使用一个EncoderExceptionFallback类,如果调用它,它将抛出一个EncoderFallbackException

此代码将尝试对字符串使用Windows1252编码,如果编码不支持字符串中的所有字符,则将ok变量设置为false

代码语言:javascript
运行
AI代码解释
复制
Encoding e = Encoding.GetEncoding(1252, new EncoderExceptionFallback(), new DecoderExceptionFallback());
bool ok = true;
try {
  e.GetByteCount(allIn);
} catch (EncoderFallbackException) {
  ok = false;
}

由于您实际上不会将编码的结果用于任何事情,所以可以使用GetByteCount方法。它将检查如何在不产生编码结果的情况下对所有字符进行编码。

在您的方法中使用的方法如下:

代码语言:javascript
运行
AI代码解释
复制
private static String GetBase64Alternate(string text) {
  Encoding e = Encoding.GetEncoding(1252, new EncoderExceptionFallback(), new DecoderExceptionFallback());
  bool ok = true;
  try {
    e.GetByteCount(allIn);
  } catch (EncoderFallbackException) {
    ok = false;
  }
  return ok ? null : Convert.ToBase64(Encoding.UTF8.GetBytes(text));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27511937

复制
相关文章
mysql -- 清空表中数据
注 : truncate操作中的table可以省略,delete操作中的*可以省略
互联网-小阿宇
2022/11/21
5.1K0
mysql — 清空表中数据
注 : truncate操作中的table可以省略,delete操作中的*可以省略
全栈程序员站长
2022/06/29
6.4K0
清空表与删除表mysql
为某基于wordpress搭建的博客长久未除草,某天升级的时候发现已经被插入了几万条垃圾留言,如果一条条删除那可真是累人的活。遂考虑直接进入mysql直接清空表或者删除表中数据。
hankleo
2020/09/16
8.2K0
MYSQL 清空表和截断表
清空表只是清空表中的逻辑数据,但是物理数据不清除,如主键值、索引等不被清除,还是原来的值。
OwenZhang
2021/12/08
5.3K0
Mysql清空表中数据「建议收藏」
第一种方法 是删除表中数据且主键ID是继续顺序排下去 第二种方法 是彻底清空表中数据 把数据结构恢复至刚建表的时候 数据全部清空
全栈程序员站长
2022/09/05
3.4K0
Sqlite清空表数据
命令如下 delete from TableName;//清空数据 update sqlite_sequence SET seq = 0 where name ='TableName';//自增长ID为0
孤鸿
2022/09/23
3.3K0
MySQL清空表数据
说明:删除内容、释放空间但不删除定义,也就是数据表的结构还在。与drop不同的是,它只是清空表数据而已,它比较温柔。
全栈程序员站长
2022/07/01
6.4K0
mysql清空表数据_mysql数据库之如何清空表中数据「建议收藏」
本篇文章主要讲述的是在数据库中使用清空命令,具有一定学习价值,有需要的朋友可以了解一下,希望能够对你有所帮助。
全栈程序员站长
2022/06/29
9.7K0
mysql清空表数据_mysql数据库之如何清空表中数据「建议收藏」
清空mysql 表数据
删除表数据,相当于一条条删除,需要注意的是,如果有字段是自增的(一般为id),这样删除后,id 值还是存在的。
全栈程序员站长
2022/08/26
5.5K0
php清空mysql数据表,mysql怎么清空数据表数据[通俗易懂]
在mysql中,可以利用“DELETE”和“TRUNCATE”关键字来清空数据表中的数据,具体语法为“DELETE FROM 数据表;”和“TRUNCATE TABLE 数据表;”。
全栈程序员站长
2022/08/25
12.4K0
php清空mysql数据表,mysql怎么清空数据表数据[通俗易懂]
sql清空表数据命令
有三种清空方式: 1.delete from 表名 :逐行删除表数据速度比较慢,不适合删除数据量大的表。 2.truncate table 表名 :删除表中所有数据并且保留表结构,但是不能撤消还原。 3.drop from 表名 :表数据和表结构一起删除,在实践过程中删除大数据量表数据。使用 1,2这两种方法需要等待好久才能清空完成。 有一个较快的方法是先导出表结构,对原先表进行删除,然后再重建。
全栈程序员站长
2022/07/01
2.9K0
MySQL快速清空表数据
相较而言知,完全删除一个表所有记录,道truncate 比 delete速度快的多。
全栈程序员站长
2022/08/24
4.2K0
Leetcode No.217 存在重复元素(hash表)
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。
week
2022/01/07
1860
mysql清空数据库所有表的命令_mysql清空表数据命令是什么?_数据库,mysql,清空表数据…[通俗易懂]
2、在mysql安装目录下,新建my.ini文件,设置默认字符集、端口、存储引擎等;
全栈程序员站长
2022/06/28
19.8K0
mysql清空数据库所有表的命令_mysql清空表数据命令是什么?_数据库,mysql,清空表数据…[通俗易懂]
SQL 清空表数据的方法
一般建議盡可能使用delete去刪除表的字段,它具有選擇 性刪除的作用,所以常常delete from tablename where 條件 delete和truncate作用其實是一樣的,隻是truncate后面不跟where條件句,它的作用是刪除表中所有的行(記錄) 兩者最大的區別就是delete是寫日誌文件的,而truncate則不寫日誌直接刪除,前者可恢復,而后者無法恢復,后者的危險性更高,所以一般不建議 使用truncate,常用delete
全栈程序员站长
2022/09/06
1.3K0
SQL:删除表中重复的记录
--创建测试表 if object_id('test') is not null drop table test create table test ( id int identity(1,1) primary key, name varchar(50) ) --插入几条测试数据 insert into test select 'a' union all select 'a' union all select 'a' union all select 'a' union all select 'a
用户8983410
2021/11/02
4.8K0
sql删除或清空表数据[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132352.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/12
10K0
删除MySQL表中的重复数据?
一般我们将数据存储在MySQL数据库中,它允许我们存储重复的数据。但是往往重复的数据是作废的、没有用的数据,那么通常我们会使用数据库的唯一索引 unique 键作为限制。问题来了啊,我还没有创建唯一索引捏,数据就重复了(我就是忘了,怎么滴)。
青衫染红尘
2023/02/28
7.3K0
删除表中重复数据「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105915.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/09
9760
Mysql truncate 清空表数据「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138902.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/02
2.3K0

相似问题

用改变的像素值openCV显示图像

13

数着不。使用OpenCV显示图像中的黑白像素

20

如何将像素值转换为opencv中的显示图像

12

Python:图像显示中的像素值?

10

如何使用抖动显示只有黑白像素的灰色图像?

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文