在 Java 中从 Windows 1252 转换为 UTF8:使用 CharsetDecoder/Encoder 处理空字符

2024-03-01

我知道这是一个非常普遍的问题,但我变得很生气。

我使用了这段代码:

String ucs2Content = new String(bufferToConvert, inputEncoding);        
        byte[] outputBuf = ucs2Content.getBytes(outputEncoding);        
        return outputBuf;

但我读到最好使用 CharsetDecoder 和 CharsetEncoder (我的内容可能包含目标编码之外的某些字符)。我刚刚编写了这段代码,但有一些问题:

// Create the encoder and decoder for Win1252
Charset charsetInput = Charset.forName(inputEncoding);
CharsetDecoder decoder = charsetInput.newDecoder();

Charset charsetOutput = Charset.forName(outputEncoding);
CharsetEncoder encoder = charsetOutput.newEncoder();

// Convert the byte array from starting inputEncoding into UCS2
CharBuffer cbuf = decoder.decode(ByteBuffer.wrap(bufferToConvert));

// Convert the internal UCS2 representation into outputEncoding
ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(cbuf));
return bbuf.array();

确实这段代码将空字符序列附加到缓冲区!!!!!

有人能告诉我问题出在哪里吗?我对Java中的编码转换不太熟练。

有没有更好的方法来转换Java中的编码?


你的问题是ByteBuffer.array()返回对用作 ByteBuffer 后备存储的数组的直接引用,而不是后备数组有效范围的副本。你必须服从bbuf.limit()(正如彼得在他的回应中所做的那样)并且只使用索引中的数组内容0 to bbuf.limit()-1.

后备数组中存在额外 0 值的原因是 CharsetEncoder 创建结果 ByteBuffer 的方式存在一个小缺陷。每个 CharsetEncoder 都有一个“每个字符的平均字节数”,这对于 UCS2 编码器来说似乎简单且正确(2 个字节/字符)。遵循这个固定值,CharsetEncoder 最初分配一个具有“字符串长度 * 每个字符的平均字节数”字节的 ByteBuffer,在本例中例如10 个字符长的字符串需要 20 个字节。然而,UCS2 CharsetEncoder 以 BOM(字节顺序标记)开始,它也占用 2 个字节,因此 10 个字符中只有 9 个适合分配的 ByteBuffer。 CharsetEncoder 检测到溢出并分配一个长度为 2*n+1 的新 ByteBuffer(n 是 ByteBuffer 的原始长度),在本例中 2*20+1 = 41 字节。由于仅需要 21 个新字节中的 2 个来对剩余字符进行编码,因此您获得的数组bbuf.array()长度为 41 字节,但是bbuf.limit()将表明仅实际使用前 22 个条目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中从 Windows 1252 转换为 UTF8:使用 CharsetDecoder/Encoder 处理空字符 的相关文章

  • Grizzly 和 Servlet 容器上下文

    我试图在我编写的 在 Grizzly 上运行的 Servlet 中获取一些注入的上下文 例如 Session 或 HttpServletRequest 但我所做的似乎都不起作用 整个过程似乎过早地停止了 并出现以下错误 SEVERE Mis
  • AbstractCollection 的 toArray 方法的实现中的代码有什么用

    public Object toArray Estimate size of array be prepared to see more or fewer elements Object r new Object size Iterator
  • 是否可以使用检测重新定义核心 JDK 类?

    我想重新定义字节码StackOverflowError构造函数 因此当堆栈溢出发生时我有一个 钩子 我想要做的就是在构造函数的开头插入对我选择的静态方法的单个方法调用 是否有可能做到这一点 您应该能够使用两种方法之一来完成此操作 除非在过去
  • 在 Eclipse 中跨文件搜索注释掉的代码

    有没有一种快速方法可以在 Eclipse 中查找 Java 文件中所有注释掉的代码 也许是搜索中的任何选项 或者任何可以执行此操作的附加组件 它应该只能找到被注释掉的代码 而不是普通的注释 在 Eclipse 中 我只是在打开正则表达式复选
  • Spring Rest POST Json RequestBody 不支持内容类型

    当我尝试使用 post 方法发布新对象时 RequestBody 无法识别 contentType Spring 已经配置完毕 POST 可以与其他对象一起使用 但不能与这个特定对象一起使用 org springframework web
  • 如何在 Java 中根据 XSD 1.1 验证 XML?

    在 Java 中根据 XML Schema 1 1 验证 XML 文件的最佳方法是什么 我从中获取了代码tutorial http www ibm com developerworks xml library x javaxmlvalida
  • Python + PostgreSQL + 奇怪的ascii = UTF8编码错误

    我有包含字符的 ascii 字符串 x80 代表欧元符号 gt gt gt print x80 当将包含该字符的字符串数据插入数据库时 我得到 psycopg2 DataError invalid byte sequence for enc
  • 如何限制用户键入时 JTextPane 中的字符数 (Java)

    我需要不允许在输入 X 后输入任何字符 我需要在输入 X 个字符后发出蜂鸣声 我知道如何在用户按 Enter 键后执行此操作 但我需要在用户按 Enter 键之前执行此操作 我从 Oracle 站点找到的方法是将 DocumentSizeF
  • 寻找 WebElements,最佳实践

    在我们当前的自动化 使用 Selenium WebDriver Java 中 我们使用 FindBy very广泛地 例如 FindBy css a name bcrumb protected List
  • 使用 Java 检索 Window 进程的 CPU 使用率

    我正在寻找一个 Java 解决方案来查找 Windows 中正在运行的进程的 CPU 使用情况 查了一下网上 关于Java解决方案的信息似乎很少 请记住 我并不是要查找 JVM 的 CPU 使用情况 而是要查找当时在 Windows 中运行
  • UnsupportedOperationException:特权进程中不允许使用 WebView

    我在用android sharedUserId android uid system 在我的清单中获得一些不可避免的权利 从 HDMI 输入读取安卓盒子 http eweat manufacturer globalsources com s
  • java“类文件包含错误的类”错误

    我正在尝试制作一个控制台应用程序来测试我的网络服务 我成功部署了一个网络服务http localhost 8080 WS myWS http localhost 8080 WS myWS我用 wsimport 制作了代理类 wsimport
  • 如何使用java避免Mysql数据库中的“数据因列被截断”?

    在我的 Java 程序中 Hibernate Bean 类定义一列 例如 TimtableVO java Column name REPEAT DAYS private WeekdayType repeatDays hear Weekday
  • 嵌套枚举是静态的吗?

    读书时这个问题 https stackoverflow com questions 25011061 why can enum implementations not access private fields in the enum cl
  • 什么是帕斯卡风格的字符串?

    The Photoshop 文件格式文档 http www adobe com devnet apps photoshop fileformatashtml 提及帕斯卡弦而不解释它们是什么 那么 它们是什么以及它们是如何编码的 Pascal
  • java中main的返回类型

    我想知道为什么java中main方法只有void返回类型 public static void main String args 为什么main方法除了void之外没有其他返回类型 Thanks 简短的回答是 因为这就是语言规范 http
  • Java中通过FTP创建文件夹层次结构

    Java 是否有现成的功能可以在远程 FTP 服务器上创建文件夹层次结构 Apache Commons 确实提供了 FTP 客户端 但我找不到创建目录层次结构的方法 它确实允许创建单个目录 makeDirectory 但创建整个路径似乎并不
  • servlet 如何获取 servlet 之外的文件的绝对路径?

    我们一直在使用 System getProperties user dir 来获取属性文件的位置 现在它已经部署在 Tomcat 上 通过 servlet 系统调用将位置指定为 tomcat 而不是属性文件所在的位置 我们如何动态调用属性文
  • 用于从链表中删除元素的大 O 表示法[重复]

    这个问题在这里已经有答案了 我正在阅读有关链接列表的内容 我发现 从链表中删除所需的元素需要 O n 运行时间 其中 n 是元素的数量 列表中的元素 http www cs mcgill ca dprecup courses IntroCS
  • Spring 和 Hibernate 连接池

    如何使用 Spring 和 Hibernate 配置连接池 Thanks Venu 您可以使用 DBCP 组件

随机推荐

  • 链接 PHP 文本

    我正在使用 TinySong api 生成链接 它可以工作 现在我尝试使用 linkify 来生成链接 事实并非如此 我不确定为什么它没有链接 我相信我使用了正确的变量 这是代码
  • Java 中的 Perlin 噪声

    对于我正在从事的元胞自动机项目 我需要使用不同的算法和技术随机生成二维布尔数组 目前 我在应用程序中只有一种类型的随机化 循环遍历数组中的每个单元格并生成随机双变量 然后如果随机数高于 0 5 则将该单元格设置为 true 如果不是 则设置
  • 未定义的子例程 &main::首先在 hello.pl 第 6 行调用

    我的 Perl 代码面临一个问题 我创建了一个包 Welcome pm 并在脚本 hello pl 中使用它 但出现以下错误 未定义子例程 main First 在 hello pl 第 6 行调用 我也查看了其他答案 但仍然无法弄清楚代码
  • 无法在 Android 上显示实时流数据

    我正在尝试将原始 H264 数据从相机设备显示到我的 Android 应用程序 我能够在 Textview 上接收数据 但无法在 Textureview 上显示它 我是 android 的初学者 我不是解码原始数据的专家 如果有人能提出解决
  • Android Webview 加载对话框没有被关闭

    我正在使用以下代码 class CustomWebViewClient extends WebViewClient Context context ProgressDialog pd null public CustomWebViewCli
  • 如何写入或读取 XML 配置文件 (.config)

    我必须在安装的后期部分编写一个配置文件 如果存在旧版本的产品 则必须从配置文件中读取 配置文件是 XML 配置文件 config 配置文件将有很多条目 例如
  • .css .js 文件上的 php-fpm apache2 403 错误

    我正在尝试在 debian jessie 上设置一个具有多个虚拟主机的 apache2 服务器 我希望他们每个人都有一个不同的 FastCgiExternalServer 我在 jessie 上使用 php5 fpm 包中的 php 版本以
  • Pandas 将计算行添加到数据框的底部

    下面是我拥有的数据框的一个小样本 我想在其底部添加一个计算行 sch q1 q2 q3 acc Yes Yes No acc Yes No No acc Yes No No acc Yes Yes Yes 我想在底部添加一行 该行将给出每列
  • mysql查询生成序列号

    我有一张表 student marks marks 44 55 64 98 76 预期输出 serial number marks 1 44 2 55 3 64 4 98 5 76 使用 mysql 用户定义的变量 可以使用查询来完成 se
  • 单元测试 Swagger 输出

    我在 ASP NET MVC WebAPI 项目中使用 Swagger 该项目安装了 Swashbuckle nugget 包并生成 Swagger UI 和 Swagger docs v1 我一直遇到的一个问题是 开发人员会因为不仔细命名
  • Python 中的基本日志记录 dictConfig

    NOTE我知道这个答案 https stackoverflow com questions 7507825 python complete example of dict for logging config dictconfig但这对我不
  • 在 CSV 导出中输出列标题

    我有一个导出到 csv 文件的查询 它工作得很好 唯一我不明白的是我还需要导出列标题 并将它们显示为全名 用户名 标志和原因 下面是代码 它可以很好地导出所有行 但我不确定如何导出受尊重的行上方的列标题 header Content typ
  • 如何让 ocaml 相信两个函子实例化是相等的

    假设我有许多模块 它们都使用一种模块类型进行参数化 并且彼此之间也具有依赖关系 module type AT sig end module B A AT struct module Hash struct type t int let eq
  • 调试 R 中的通用函数

    如何调试通用函数 使用 debug 或调试包中的 mtrace 举个例子 我想调试 NADA 包中的 cenreg 特别是采用公式输入的方法 您可以像这样检索方法详细信息 library NADA getMethod cenreg c fo
  • 在 iPhone 上用手指画直线

    背景 我正在尝试创建一个非常简单的 iPhone 应用程序 允许用户用手指在屏幕上绘制多条直线 我在我的程序中使用这两种方法UIViewController捕获每条线端点的坐标 void touchesBegan NSSet touches
  • 通过 Retrofit 将图像文件从 Android 发送到 Spring

    我正在尝试通过 Spring 将 Image 通过 Retrofit 上传到 S3 所以 这基本上是两个任务 将图像传递给 Spring API 从 Spring API 将其上传到 S3 服务器 我知道如何将图像上传到 S3 并且工作正常
  • Xcode 9 中未检测到 GoogleMobileAds (Admob) 框架 - 链接器错误

    我收到引用自的链接器错误 GADInterstitial 架构arm64的未定义符号 我使用最新的admob框架GoogleMobileAdsSdkiOS 7 24 0 请参阅附图 如何修复 iOS 11 的问题 这是 Xcode 9 的错
  • 是否可以在进程运行时停止 libxml 解析器?

    我正在使用 libxml 解析器来快速下载和显示 我的问题是在某些情况下我需要在解析器处理时停止它 可以做吗 你们能给我建议吗 提前致谢 塞卡尔 贝塔拉姆 SAX2 libxml2 API 具有xmlStopParser 在这种情况下可能有
  • 当 TabBarView 子项滚动时使 SliverAppBar 可滚动

    我的主屏幕带有底部导航 由两个项目组成 其中所有项目都有 ListView 和无限列表 并且我希望当用户在其中一个列表中滚动时 SliverAppBar 可以滚动 这是我到目前为止所拥有的 class HomeScreen extends
  • 在 Java 中从 Windows 1252 转换为 UTF8:使用 CharsetDecoder/Encoder 处理空字符

    我知道这是一个非常普遍的问题 但我变得很生气 我使用了这段代码 String ucs2Content new String bufferToConvert inputEncoding byte outputBuf ucs2Content g