共享内存中文变乱码

问题描述

定义了一个环形共享内存:messagestationpublicstaticRingBuffer<String>messagestation=newRingBuffer<String>(10000);问题是:中文字符串经过写入(add)、读出(get)操作之后变为乱码,get()和add()函数见下面RingBuffer的定义。谁有好的解决方案啊?packageC3P0DB;importjava.nio.BufferUnderflowException;importjava.util.concurrent.Semaphore;importjava.util.logging.Level;importjava.util.logging.Logger;/***环形缓冲区*@authorroot*/publicclassRingBuffer<T>{privateT[]buffer;privateinttail;privateinthead;publicintN;publicstaticSemaphoreinSemaphore=newSemaphore(10000);//Landong:inputsemaphorepublicstaticSemaphoreoutSemaphore=newSemaphore(0);//Landong:outputsemaphore@SuppressWarnings("unchecked")publicRingBuffer(intn){buffer=(T[])newObject[n];tail=0;head=0;N=0;}publicbooleanisEmpty(){returnN==0;}publicintsize(){returnN;}publicvoidadd(TtoAdd){try{inSemaphore.acquire();//获取写入令牌}catch(InterruptedExceptionex){Logger.getLogger(RingBuffer.class.getName()).log(Level.SEVERE,null,ex);}head=head%buffer.length;buffer[head++]=toAdd;//newcharactertoaddN++;outSemaphore.release();//释放读出令牌}publicTget(){try{outSemaphore.acquire();//获取写入令牌}catch(InterruptedExceptionex){Logger.getLogger(RingBuffer.class.getName()).log(Level.SEVERE,null,ex);}if(isEmpty()){thrownewBufferUnderflowException();}Tt=null;t=(T)buffer[tail++];N--;tail=tail%buffer.length;inSemaphore.release();//释放读出令牌returnt;}@OverridepublicStringtoString(){return"CircularBuffer(size="+buffer.length+",head="+head+",tail="+tail+")";}}

解决方案

本帖最后由 woshiliulisong 于 2014-12-19 09:21:15 编辑
解决方案二:
Java内核是使用Unicode,它只记住一个字符的UnicodeCodePoint数字,当我们“不打算与任何外部系统交换数据时是没有字符集的问题的,也就不存在乱码”,我们看到乱码时因为你打算把它通过网络发送出去或写入到磁盘或者反过来处理它们。这里你的代码中并没有直接的字符串与外部系统的数据交换,唯一的例外是你把它写到日志文件中,因此问题只是出在日志文件中,在你看日志是使用的文本编辑器中找“字符集”或“字符编码”这样的菜单项,然后切换一下使用其它字符集来查看。程序本身没有问题,只是你看文件时使用的字符集与当时创建这个日志文件时使用的字符集不一致。至少你当时创建这个日志时使用的字符集是什么,你可以在程序中:System.out.println("默认字符集:"+System.getProperty("file.encoding"));

解决方案三:
引用1楼humanity的回复:

Java内核是使用Unicode,它只记住一个字符的UnicodeCodePoint数字,当我们“不打算与任何外部系统交换数据时是没有字符集的问题的,也就不存在乱码”,我们看到乱码时因为你打算把它通过网络发送出去或写入到磁盘或者反过来处理它们。这里你的代码中并没有直接的字符串与外部系统的数据交换,唯一的例外是你把它写到日志文件中,因此问题只是出在日志文件中,在你看日志是使用的文本编辑器中找“字符集”或“字符编码”这样的菜单项,然后切换一下使用其它字符集来查看。程序本身没有问题,只是你看文件时使用的字符集与当时创建这个日志文件时使用的字符集不一致。至少你当时创建这个日志时使用的字符集是什么,你可以在程序中:System.out.println("默认字符集:"+System.getProperty("file.encoding"));

长知识了,2楼好牛x
解决方案四:
在哪里看到的乱码?

时间: 2025-01-29 21:50:51

共享内存中文变乱码的相关文章

Win7系统CMD命令提示符输入中文变乱码的解决方法

  解决方法: 1.首先打开CMD命令提示符; 2.打开命令提示符后,输入chcp 936,点击回车; 3.执行后如果显示的是"活动代码页:936"即可解决问题,如果显示的是"□□□□□:936",则往下看; 4.右击命令提示符的标题栏,选择打开"默认值",并选择"默认代码页"为"936",点击确定即可. 以上就是对win7下CMD中文变成乱码的解决方法全部内容的介绍,有同样问题的朋友可以按照上述的方法进行

eclipse中注释乱码,新写的代码能显示中文,以前的中文变不会去

问题描述 eclipse中注释乱码,新写的代码能显示中文,以前的中文变不会去 之前好好的,今天打开就是乱码,而且,新写的是能显示中文,以前的中文怎么也变不回来,按照网上说的都改过了没用,该怎么办 解决方案 看一下编码格式看看,是不是以前的GBK改成了UTF-8,试试改一下工程字符集,看能不能把中文变回来. 解决方案二: 先看看工程的编码方式,在看看乱码类的编码方式.弄成一样的在试试是否还是乱码! 解决方案三: 这个乱码确实很烦人的,尤其是用svn好多人一起修改代码的时候. 解决方案四: 将当前文

jquery-为什么一输入中文就乱码

问题描述 为什么一输入中文就乱码 在IDE中练习 Jquery ,一切都正常,但是加载文档后 其他都没问题,只是中文都变乱码了,这是为什么啊!求大神解答 解决方案 meta制定编码和存储不一致,如果你meta指定charset为utf-8,你的html文件存储编码需要为utf-8,不能为ansi ansi时你的meta需要制定charset为gb2312 存储编码可以用记事本打开文件,另存为,选择编码后存储覆盖原来的文件 解决方案二: 中文乱码,一般都是因为编码的问题.你先要了解 Jquery

mysql欧洲国家的文字乱码?英语、中文没有乱码是什么原因呢?

问题描述 [举例]波兰语Śląskie中的Ś和ą字母显示的是?1.修改配置文件my.ini里的:default-character-set = utf8character-set-server = utf82.命令行设置:mysql> show variables like 'character%';+--------------------------+---------------------------------------------------------+| Variable_na

进程间共享内存 由于某个进程异常退出导致死锁

解决Nginx和Fpm-Php等内部多进程之间共享数据问题 概念说明: 1. MINIT:Php扩展的初始化方法,整个模块启动时候被调用一次 2. RINIT:Php扩展的初始化方法,每个请求会调用一次 3. ClusterMap(简称CM):提供服务定位和集群地图功能,通过接收心跳和主动探测方式收集节点状态信息,统一管理多种异构集群,替换硬负载均衡设备 4. CMSubProxy:ClusterMap内部的一个订阅者客户端代理,定期和Server端通讯,获取最新的集群信息,更新内部维护的机器列

解决win7系统所有中文显示乱码的方法教程

  在win7系统下我们如果把语言操作系统界面语言修改为英文后,有部分用户的电脑中的英文字体将显示乱码的问题,对于出现该问题是因为中文不是Unicode语言,用户在将系统语言设置为英文后,语言设置的非Unicode设置出问题而导致的,故此我们需要将非Unicode的语言修改为中文语言即可解决这个问题,下面我们看下具体的操作教程吧! 解决win7系统所有中文显示乱码的方法教程 1.点击开始菜单图标并单击打开控制面板. 2.在区域和语言设置-管理中,选择更改显示语言. 3.选择管理标签,并点击更改系

win7英文版中文显示乱码解决

win7英文版中文显示乱码-很多软件无法安装的解决 win7英文版中文显示乱码处理方式: Control Pannel-->Clock, Language, and Region--> Administrative-->Change system locale-->Select Chinese (PRC)

我用了共享内存映射,但是,串口来的数写到共享内存里,就是更新不到磁盘文件里去咋办??

问题描述 我用了共享内存映射,但是,串口来的数写到共享内存里,就是更新不到磁盘文件里去咋办?? 共享内存映射,flushviewoffile,更新磁盘文件(那个flushviewoffile 返回都是对的可是文件里就是没有东西) 解决方案 先看i数据是否正确接收了,有没有写入共享内存.

netty服务端接收到中文通信乱码问题

问题描述 netty服务端接收到中文通信乱码问题 不多说 问题如题 以下是服务端代码 public void channelRead(ChannelHandlerContext ctx, Object msg) { try { ByteBuf buf = (ByteBuf) msg; byte[] req = new byte[buf.readableBytes()]; buf.readBytes(req); String body = new String(req, "UTF-8")