Java中如何将gbk装换为ansi

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中如何将gbk装换为ansi相关的知识,希望对你有一定的参考价值。

我用String.getBytes("ansi")不能转,而且MyEclipse 8.6中的字符集里面没有ansi
我现在用jna调用dll,在dll中有个构造中的属性为char*类型,Java中我用String对应,但是实现不了,所以想用byte[]形式,但是dll用c编写的,编码为ansi,所以我要想把编码转为,ansi;我上网查了一下所有的都是读取ansi的文件,然后读取时转为gbk或是utf-8形式的。请大牛给一种用java 中将gbk转为ansi的方法

对于java,在字符集间进行转换时比较常用的功能,尤其在web应用中。
首先我们要先了解一些知识点:
一、关键技术点:
1、当前流行的字符编码格式有:US-ASCII、ISO-8859-1、UTF-8、UTF-16BE、UTF-16LE、UTF-16、GBK、GB2312等,其中GBK、GB2312是专门处理中文编码的。
2、String的getBytes方法用于按指定编码获取字符串的字节数组,参数指定了解码格式,如果没有指定解码格式,则按系统默认编码格式。
3、String的“String(bytes[] bs, String charset)”构造方法用于把字节数组按指定的格式组合成一个字符串对象
二、下面是一个完整的例子,包括了你提问中的gbk转ascii,同时也提供了一些其他字符集间的转码方式,可留存备查:
public class ChangeCharset
/** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */
public static final String US_ASCII = "US-ASCII";
/** ISO拉丁字母表 No.1,也叫做ISO-LATIN-1 */
public static final String ISO_8859_1 = "ISO-8859-1";
/** 8 位 UCS 转换格式 */
public static final String UTF_8 = "UTF-8";
/** 16 位 UCS 转换格式,Big Endian(最低地址存放高位字节)字节顺序 */
public static final String UTF_16BE = "UTF-16BE";
/** 16 位 UCS 转换格式,Litter Endian(最高地址存放地位字节)字节顺序 */
public static final String UTF_16LE = "UTF-16LE";
/** 16 位 UCS 转换格式,字节顺序由可选的字节顺序标记来标识 */
public static final String UTF_16 = "UTF-16";
/** 中文超大字符集 **/
public static final String GBK = "GBK";

public static final String GB2312 = "GB2312";

/** 将字符编码转换成US-ASCII码 */
public String toASCII(String str) throws UnsupportedEncodingException
return this.changeCharset(str, US_ASCII);


/** 将字符编码转换成ISO-8859-1 */
public String toISO_8859_1(String str) throws UnsupportedEncodingException
return this.changeCharset(str, ISO_8859_1);


/** 将字符编码转换成UTF-8 */
public String toUTF_8(String str) throws UnsupportedEncodingException
return this.changeCharset(str, UTF_8);


/** 将字符编码转换成UTF-16BE */
public String toUTF_16BE(String str) throws UnsupportedEncodingException
return this.changeCharset(str, UTF_16BE);


/** 将字符编码转换成UTF-16LE */
public String toUTF_16LE(String str) throws UnsupportedEncodingException
return this.changeCharset(str, UTF_16LE);


/** 将字符编码转换成UTF-16 */
public String toUTF_16(String str) throws UnsupportedEncodingException
return this.changeCharset(str, UTF_16);


/** 将字符编码转换成GBK */
public String toGBK(String str) throws UnsupportedEncodingException
return this.changeCharset(str, GBK);


/** 将字符编码转换成GB2312 */
public String toGB2312(String str) throws UnsupportedEncodingException
return this.changeCharset(str,GB2312);


/**
* 字符串编码转换的实现方法
* @param str 待转换的字符串
* @param newCharset 目标编码
*/
public String changeCharset(String str, String newCharset) throws UnsupportedEncodingException
if(str != null)
//用默认字符编码解码字符串。与系统相关,中文windows默认为GB2312
byte[] bs = str.getBytes();
return new String(bs, newCharset); //用新的字符编码生成字符串

return null;


/**
* 字符串编码转换的实现方法
* @param str 待转换的字符串
* @param oldCharset 源字符集
* @param newCharset 目标字符集
*/
public String changeCharset(String str, String oldCharset, String newCharset) throws UnsupportedEncodingException
if(str != null)
//用源字符编码解码字符串
byte[] bs = str.getBytes(oldCharset);
return new String(bs, newCharset);

return null;


public static void main(String[] args) throws UnsupportedEncodingException
ChangeCharset test = new ChangeCharset();
String str = "This is a 中文的 String!";
System.out.println("str:" + str);

String gbk = test.toGBK(str);
System.out.println("转换成GBK码:" + gbk);
System.out.println();

String ascii = test.toASCII(str);
System.out.println("转换成US-ASCII:" + ascii);
System.out.println();

String iso88591 = test.toISO_8859_1(str);
System.out.println("转换成ISO-8859-1码:" + iso88591);
System.out.println();

gbk = test.changeCharset(iso88591, ISO_8859_1, GBK);
System.out.println("再把ISO-8859-1码的字符串转换成GBK码:" + gbk);
System.out.println();

String utf8 = test.toUTF_8(str);
System.out.println();
System.out.println("转换成UTF-8码:" + utf8);
String utf16be = test.toUTF_16BE(str);
System.out.println("转换成UTF-16BE码:" + utf16be);
gbk = test.changeCharset(utf16be, UTF_16BE, GBK);
System.out.println("再把UTF-16BE编码的字符转换成GBK码:" + gbk);
System.out.println();

String utf16le = test.toUTF_16LE(str);
System.out.println("转换成UTF-16LE码:" + utf16le);
gbk = test.changeCharset(utf16le, UTF_16LE, GBK);
System.out.println("再把UTF-16LE编码的字符串转换成GBK码:" + gbk);
System.out.println();

String utf16 = test.toUTF_16(str);
System.out.println("转换成UTF-16码:" + utf16);
String gb2312 = test.changeCharset(utf16, UTF_16, GB2312);
System.out.println("再把UTF-16编码的字符串转换成GB2312码:" + gb2312);


参考技术A ansi表示的是本地编码。

在中文window中,你用记事创建一个新文件后,直接保存,此时是就是以本地编码(也即GBK),一般ansi为GBK(GB2312)编码。
所以如果你再进行转码,只会更乱。
java的转码代码:

new String(string.getBytes("UTF-8"),"GBK");追问

关键我是要和动态库调用的接口的编码一致,接口的编码为ansi,你说的那种方法我试过了,不行

追答

这个是百度百科对ANSI编码的解释:

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。 当然对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ASNI编码与Unicode编码之间最大也最明显的区别。

而java获取本地编码的方式是: System.getProperty("file.encoding")

本回答被提问者和网友采纳
参考技术B 没有“gbk转ansi”这样的说法吧,GBK是汉字编码,ansi是英文编码,两者怎么转换?你是不是要取汉字的内码,如果是可以这样:
var s:string;
i,j:Byte;
begin
s:='中';
i:=ord(s[1]);//第一个字节
j:=ord(s[2]);//第二个字节
end;

如何将PSD批量装换为JPG如何对PSD批量减小体积

1 将PSD批量转换为JPG等格式图片方法(注意选中图片之后要点击Add或者Add all把他们放到下面的窗口)

 

2 转换完成效果如图所示

 

3 想要批量修改大小,就要使用ACDSee这个软件了。全部选中一些图片,然后右击批量,选择调整大小,比如调整为默认的

 

4 可以发现原来100多M的变成了1M多,可加压缩比例还是非常大的。

 

5 我们用Photoshop打开看一下减肥之后的PSD文件图层样式有没有变化,实际测试发现,之所以可以变得这么小,其实是丢弃掉了所有的图层信息,这样,这个PSD文件就没有什么意义了。当然,图像的大小也变得很小了。

 

6 目前比较可行的办法还是通过Photoshop,录制一套动作,然后逐个对每个图片应用,但是对于大图片而言(比如100M以上)不管是打开还是调节大小都是需要耗费大量时间的。

 

7 Adobe Bridge也无能为力,要转换为PDF倒是可以的。

以上是关于Java中如何将gbk装换为ansi的主要内容,如果未能解决你的问题,请参考以下文章

如何将文本批量装换为数值

如何将PSD批量装换为JPG如何对PSD批量减小体积

DataSet装换为泛型集合

DataSet装换为泛型集合 222

json文本装换为JSONArray

js获取input上传图片装换为base64格式图片