问题描述
定义了一个环形共享内存: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
解决方案四:
在哪里看到的乱码?