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

复制
相关文章
【约束布局】ConstraintLayout 13 种相对定位属性组合 ( 属性组合 | 用法说明 )
相对定位 属性 组合 前提 : 以 水平方向的 Left , Right 为例 ;
韩曙亮
2023/03/27
8170
【约束布局】ConstraintLayout 13 种相对定位属性组合 ( 属性组合 | 用法说明 )
RelativeLayout(相对布局)
相对布局的子控件会根据它们所设置的参照控件和参数进行相对布局。 参照控件:aclock   控件与容器之间 android:layout_alignParentLeft="true" 位于父容器左上角 android:layout_alignParentBottom, android:layout_alignParentTop, android:layout_alignParentRight 只能在父控件为RelativeLayout时才起作用,而对于像LinearLayout这样的布局不起作用 andro
欢醉
2018/01/22
1.2K0
RelativeLayout(相对布局)
相对布局RelativeLayout(三)
最新Android开发视频教程(共6章)Android Studio教程(2017-2018) 19 Android 相对布局的使用(视频+笔记,从01开始点点入门) Android studio 相对布局常见属性 Android----------线性布局和相对布局的使用
李小白是一只喵
2020/04/24
9870
android 相对布局(RelativeLayout)
RelativeLayout可以设置某一个控件相对于其他控件的位置,这些位置可以包括上下左右等,因而相较于其他的布局方式而言具有很大的灵活性。
Twcat_tree
2022/11/30
1K0
【鸿蒙 HarmonyOS】UI 布局 ( 相对布局 DependentLayout )
下面的相对布局中 text1 组件没有设置任何位置属性 , 默认放在屏幕左上角 ;
韩曙亮
2023/03/28
6920
【鸿蒙 HarmonyOS】UI 布局 ( 相对布局 DependentLayout )
Flutter 相对布局之Stack
相对布局,类似于android中的RelativeLayout、FrameLayout。 既可以相对父容器确定自己的位置,也可以多个widget重叠显示。 Stack与Positioned搭配使用。
yechaoa
2022/06/10
8050
Flutter 相对布局之Stack
轻松掌握RelativeLayout相对布局
在前面三期中我们对LinearLayout进行了详细的解析,LinearLayout也是我们用的比较多的一个布局。但在实际开发中使用LinearLayout远远不够,我们本期一起来学习RelativeLayout。 一、认识RelativeLayout RelativeLayout,又叫相对布局,使用<RelativeLayout>标签。相对布局通常有两种形式,一种是相对于容器而言的,一种是相对于控件而言的。 下表显示了RelativeLayout支持的常用XML属性及相关方法的说明
分享达人秀
2018/02/02
1K0
轻松掌握RelativeLayout相对布局
[android] 相对布局和单位简介
/**********************2016年4月23日 更新*******************************/
唯一Chat
2019/09/10
5120
[android] 线性布局和布局的组合
/****************2016年4月25日 更新******************************/
唯一Chat
2019/09/10
5830
Android基础_3 Activity相对布局
相对布局要比前面讲的线性布局和表格布局要灵活一些,所以平常用得也是比较多的。相对布局控件的位置是与其周围控件的位置相关的,从名字可以看出来,这些位置都是相对的,确定出了其中一个控件的位置就可以确定另一个控件的位置了。
shirayner
2018/08/10
5440
Android基础_3   Activity相对布局
Android开发中RelativeLayout相对布局
        RelativeLayout布局是Android界面布局中应用最广也最强大的一种布局,其不仅十分灵活,可以解决开发中各种界面布局需求,同时也很方便了解决了多屏幕尺寸的适配问题。在iOS开发中,Autolayout技术总是被赞不绝口,RelativeLayout布局就是Andriod系统中的Autolayout,其又被称为相对布局。
珲少
2018/08/15
1.2K0
Android开发中RelativeLayout相对布局
Android入门教程 | UI布局之RelativeLayout 相对布局
RelativeLayout 和 LinearLayout 类似,都是 ViewGroup,能“容纳”多个子view。
Android_anzi
2021/12/06
2.9K0
IOS开发之绝对布局和相对布局(屏幕适配)
之前如果做过Web前端页面的小伙伴们,看到绝对定位和相对定位并不陌生,并且使用起来也挺方便。在IOS的UI设计中也有绝对定位和相对定位,和我们的web前端的绝对定位和相对定位有所不同但又有相似之处。下面会结合两个小demo来学习一下我们IOS开发中UI的绝对定位和相对定位。在前面的博客中所用到的UI事例用的全是绝对定位,用我们Storyboard拖拽出来的控件全是绝对定位的,就是我们可以同改变组件的frame来改变组件的位置和大小。而相对定位则不同,相对定位是参考组件周围的元素来确定组件的大小或位置,相对定
lizelu
2018/01/11
2.3K0
IOS开发之绝对布局和相对布局(屏幕适配)
[android] 优酷环形菜单-相对布局练习
布局文件,使用<RelativeLayout/>控件作为第一级菜单,相对布局,位于父控件的底部,水平居中,因为图片不是特别的标准,因此宽度和高度都钉死,宽度是高度的两倍
唯一Chat
2019/09/10
9560
[android] 优酷环形菜单-相对布局练习
Android精通:TableLayout布局,GridLayout网格布局,FrameLayout帧布局,AbsoluteLayout绝对布局,RelativeLayout相对布局
TableLayout是将子类向分别排列成行和列的布局视图容器,TableLayout是由许多TableRow对象组成的,表格布局以行列的形式管理子控件,每一个单元是一个TableRow或者View对象。
达达前端
2019/07/03
4.2K0
Android精通:TableLayout布局,GridLayout网格布局,FrameLayout帧布局,AbsoluteLayout绝对布局,RelativeLayout相对布局
小程序布局中相对定位的用法
小程序中一般为了有一定的设计效果,会将下边组件的内容提升一点到上边去,比如我们的电商展示模板里,会将商品列表覆盖一点到背景图,效果如下:
低代码布道师
2023/10/11
2790
Android开发学习笔记(六)相对布局RelativeLayout
两个值true对齐,false不对齐 相对某个控件layout_toLeftOfs (例子中没写)
zstar
2022/06/14
2400
Android开发学习笔记(六)相对布局RelativeLayout
R语言 绘图组合布局grid/layout
par(mfrow=c(2,2)),可以理解将绘图区域分割为2x2的矩阵区域,另可参照《R语言实战》3.5图形的组合
拴小林
2020/07/10
2.1K0
R语言 绘图组合布局grid/layout
Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件
对于Android应用程序中,所有用户界面元素都是由View和ViewGroup对象构建的。View是绘制在屏幕上能与用户进行交互的一个对象。而对于ViewGroup来说,则是一个用于存放其他View和ViewGroup对象的布局容器!
达达前端
2019/07/03
1.9K0
Android精通:View与ViewGroup,LinearLayout线性布局,RelativeLayout相对布局,ListView列表组件
点击加载更多

相似问题

多次更改相对布局的高度

10

使用相对布局多次调用SEC_Overlay

10

在父视图中多次动态包含XML相对布局

10

相对布局放置到其他相对布局

72

相对布局

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档