共享内存中文变乱码

深蓝1202 2014-12-19 09:17:58
定义了一个环形共享内存:messagestation
public static RingBuffer<String> messagestation = new RingBuffer<String>(10000);
问题是:中文字符串经过写入(add)、读出(get)操作之后变为乱码,get()和add()函数见下面RingBuffer的定义。
谁有好的解决方案啊?



package C3P0DB;


import java.nio.BufferUnderflowException;
import java.util.concurrent.Semaphore;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* 环形缓冲区
* @author root
*/
public class RingBuffer<T> {

private T[] buffer;
private int tail;
private int head;
public int N;
public static Semaphore inSemaphore = new Semaphore(10000);//Landong: input semaphore
public static Semaphore outSemaphore = new Semaphore(0);//Landong: output semaphore

@SuppressWarnings("unchecked")
public RingBuffer(int n) {
buffer = (T[]) new Object[n];

tail = 0;
head = 0;
N = 0;
}

public boolean isEmpty() {
return N == 0;
}

public int size() {
return N;
}

public void add(T toAdd) {
try {
inSemaphore.acquire();//获取写入令牌
} catch (InterruptedException ex) {
Logger.getLogger(RingBuffer.class.getName()).log(Level.SEVERE, null, ex);
}
head = head % buffer.length;
buffer[head++] = toAdd; // new character to add
N++;
outSemaphore.release();//释放读出令牌
}

public T get() {
try {
outSemaphore.acquire();//获取写入令牌
} catch (InterruptedException ex) {
Logger.getLogger(RingBuffer.class.getName()).log(Level.SEVERE, null, ex);
}
if (isEmpty()) {
throw new BufferUnderflowException();
}
T t = null;

t = (T) buffer[tail++];
N--;
tail = tail % buffer.length;
inSemaphore.release();//释放读出令牌
return t;

}

@Override
public String toString() {
return "CircularBuffer(size=" + buffer.length + ", head=" + head + ", tail=" + tail + ")";
}
}
...全文
276 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
冥王之锤 2014-12-19
  • 打赏
  • 举报
回复
在哪里看到的乱码?
  • 打赏
  • 举报
回复
引用 1 楼 humanity 的回复:
Java 内核是使用 Unicode,它只记住一个字符的 Unicode Code Point 数字,当我们“不打算与任何外部系统交换数据时是没有字符集的问题的,也就不存在乱码”,我们看到乱码时因为你打算把它通过网络发送出去或写入到磁盘或者反过来处理它们。 这里你的代码中并没有直接的字符串与外部系统的数据交换,唯一的例外是你把它写到日志文件中,因此问题 只是出在日志文件中,在你看日志是使用的文本编辑器中找“字符集” 或“字符编码”这样的菜单项,然后切换一下使用其它字符集来查看。程序本身没有问题,只是你看文件时使用的字符集与当时创建这个日志文件时使用的字符集不一致。 至少你当时创建这个日志时使用的字符集是什么,你可以在程序中:

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

System.out.println("默认字符集:" + System.getProperty("file.encoding"));

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧