JAVA获得字符串二进制码的问题 String.getBytes()问题

JAVA获得字符串二进制码的问题 String.getBytes()问题,第1张

PHP中的汉字部分是由文件的编码决定的。或者说目前PHP的字符串不支持汉字,把汉字看成字节原封不动的输出。Java的字符串支持汉字,要另外注意编码。比如PHP使用GBK编码的文件和java通讯时,Java的字符串就要strgetBytes("GBK");转成字节后参与编码。

另外要注意PHP的MCrypt库没有预置补齐函数和键的处理函数,

PHP在AES编码前,要写好和Java一致的,对键和数据进行相应的补齐和处理。

比如Java的AES/CBC/PKCS5Padding 方式,PHP中就要手工写一个PKCS7补齐的方法,

才可能和Java通讯。

楼上全是傻X, 这样没有的,使用开源组件吧detectorjar

用法很简单

/------------------------------------------------------------------------  

  detector是探测器,它把探测任务交给具体的探测实现类的实例完成。  

  cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法  

  加进来,如ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector。    

  detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的  

  字符集编码。  

--------------------------------------------------------------------------/  

CodepageDetectorProxy detector =   CodepageDetectorProxygetInstance();   

/-------------------------------------------------------------------------  

  ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于  

  指示是否显示探测过程的详细信息,为false不显示。  

---------------------------------------------------------------------------/  

detectoradd(new ParsingDetector(false));    

/--------------------------------------------------------------------------  

  JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码  

  测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以  

  再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。  

---------------------------------------------------------------------------/    

detectoradd(JChardetFacadegetInstance());   

//ASCIIDetector用于ASCII编码测定   

detectoradd(ASCIIDetectorgetInstance());   

//UnicodeDetector用于Unicode家族编码的测定   

detectoradd(UnicodeDetectorgetInstance());   

javaniocharsetCharset charset = null;   

File f=new File("E://specialCar//testcsv");   

try {   

      charset = detectordetectCodepage(new BufferedInputStream(new FileInputStream(f)),100);   

} catch (Exception ex) {exprintStackTrace();}   

if(charset!=null){   

     Systemoutprintln(fgetName()+"编码是:"+charsetname());   

}else{  

    Systemoutprintln(fgetName()+"未知");  

}

采纳哈

java中定义一个字符串数组方式如下:

1String[] str={"AAA","BBB","CCC"};

2String str[]={"AAA","BBB","CCC"};

string类型和其他基本类型相似,创建数组时,有上述两种方式。

java语言使用的字符码集是Unicode。Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

这儿有两种常见方法(scaner和BufferedReader) 方法一: import javautilArrays; import javautilScanner; public class 输入排序3 { public static void main(String[] args) { Systemoutprintln("请输入数据:"); Scanner input=new Scanner(Systemin);//输入方法,每输入一个数按回车确定 int num[]=new int[10];//一个长度为10的数组; for(int i=0;i<numlength;i++){ num[i]=inputnextInt();//将输入的10个数赋值给数组 } Arrayssort(num); int BigNum=num[0]; int littleNum=num[9]; Systemoutprintln("最大数:"+BigNum); Systemoutprintln("最小数:"+littleNum); } } 方法二: import javaioBufferedReader; import javaioIOException; import javaioInputStreamReader; import javautilArrays; import javautilStringTokenizer; public class 输入排序 { public static void main(String[] args) throws IOException{ BufferedReader in=new BufferedReader(new InputStreamReader(Systemin)); String test; Systemoutprint("请输入"); test=inreadLine();//让你输入字符串; StringTokenizer stoken=new StringTokenizer(test," "); int []num = new int[10]; while(stokenhasMoreElements()){ for(int i=0;i<10;i++){ num[i]=IntegervalueOf(stokennextToken()); } } Arrayssort(num); int BigNum=num[0]; int littleNum=num[9]; Systemoutprintln("最大数:"+BigNum); Systemoutprintln("最小数:"+littleNum); } }

Java 中字符串在内核中使用 Unicode,也就是说每个字符 JVM 只记录它的 Unicode Code Point,只有在网络传输或保存到磁盘上时才需要把它转换成特定的字符集的编码,这个字符集就是把一个 Unicode Code Point 整数翻译成一串 byte[],因为在网络或磁盘上,字节是一个一个排列的,我们需要知道把高位字节排前面还是排后面并且容易推断出哪个哪个字节是一个字符的边界,这样才能把相关的几个字节还原成一个字符而不是把第2个字符的后面半数字节和第3个字符的前面半数的字节拼在一起出一个怪异的字符,我们以前在早期的电脑游戏中不支持双字节汉语时我们经常碰到这个问题,那就是先输入一个汉字,在内存中有2个字节,然后我们按一下 backspace 软件只删除一个字节,我们再输入一个汉字之后一共有3个字节的,这时我们用一个支持汉字的软件来查看这个文字可能是第1个剩下的字节和后面的字符的第1字节拼起来刚好又是另一个汉字,而剩下的第3个字节就不是有意义的绘图符号。

当不需要把 JVM 内存中的字符传输到网络外或磁盘上或打印出来的时候,我们是不需要知道字符集的,在显示在图形界面上时JVM知道怎么把它们显示出来,现在的 Windows *** 作系统同样也是 Unicode 内核的,也就是说我们只要说明 Unicode Code Point 它应该知道是什么字符,那么只剩下字体这边是否也是用 Unicode Code Point 来对应一个字符啦(这个我不确定,但估计也是),如果 *** 作系统和字符这边也是按 Unicode Code Point 来对应,那么当我们不保存到磁盘或发送出网络时是完全不需要知道有字符集这回事的。

下面这个例子中处理一个 Unicode 60 新标准中收录的汉字,你看到 UTF-8, UTF-16, GB18030 支持它们,但 GB2312 没有收录这个汉字,所以出个问号,也就是我们学说的乱码啦。

什么是 Unicode,下面这样的表格就是 Unicode,而那些坐标数字就是 Code Point

JDK 15 的 String 这个类支持 Unicode Code Point,也就是说能处理任何任意超出双字节的字符的处理,它是一些学术研究者(比如考古,古文献研究) 必须的功能,回想起来曾经的电报码翻译成电脑信息时由于输入法和字符集没有收录这些字没办法通过“输入一个数字得到这个字符的途径",大家都是先扫描一个用再在电脑中剪切出每个字符的小贴出来的。记得在汉字处理时如果碰到冷僻字时它会超出2个字节,用 charAt() 这个是会出错的,因为 char 类型表示范围在 0 - 255 之间(2个字节),不能直接保存冷僻字,需要用2个 char 来表示一个字,因此 substring 的位置全是错误的,我们需要 offsetByCodePoints 重新计算一次 index 才能正确地 substring。

public static void main(String[] args) throws IOException

{

int[] codePoints = new int[16];

for (int i = 0; i < 16; i++)

{

codePoints[i] = 0x20020 + i;

}

String a = new String(codePoints, 0, codePointslength);

Systemoutprintln("字符串:" + a);

Systemoutprintln("字符串换算成 char[] 存储总长度是 :" + alength());

Systemoutprintln("codePointAt(7) 索引换算成 charAt 索引  :" + aoffsetByCodePoints(1, 7));

String c = asubstring(aoffsetByCodePoints(1, 7), aoffsetByCodePoints(1, 8));

Systemoutprintln("UTF-8   for " + c + " is " + toString(cgetBytes("UTF-8")) + " ==> "

+ new String(cgetBytes("UTF-8"), "UTF-8"));

Systemoutprintln("UTF-16  for " + c + " is " + toString(cgetBytes("UTF-16")) + " ==> "

+ new String(cgetBytes("UTF-16"), "UTF-16"));

Systemoutprintln("GB2312  for " + c + " is " + toString(cgetBytes("GB2312")) + " ==> "

+ new String(cgetBytes("GB2312"), "GB2312"));

Systemoutprintln("GB18030 for " + c + " is " + toString(cgetBytes("GB18030")) + " ==> "

+ new String(cgetBytes("GB18030"), "GB18030"));

}

private static String toString(byte[] input)

{

StringBuffer b = new StringBuffer();

bappend('[');

for (int i = 0, size = inputlength; i < size; i++)

{

bappend(IntegertoString(input[i]));

if (i < size - 1)

bappend(',');

}

bappend(']');

return btoString();

}

这个代码输出如下,为防止百度或者说你的电脑未安装支持冷僻字的字体,不能正确显示冷僻字,这里面用啦。

如果是Java的String对象的话,则一定是Unicode的,这个没有为什么,Java就是这么定的。

我猜你的问题应该是如何判断一段字节流是什么编码类型,对吗?比如一个文件,或是网络上面取下来的一段Byte数组,你需要用一个合适的编码来解析成字符串。

这个让你失望了,没有一个文档化的,确定的方法来判断,只能用测试的方法,这个方法也只是猜测,不能百分百的确定,方法如下:

用常见的编码方式对字节流进行解码,比如Unicode,UTF8, UTF8 without BOM, UTF16, ANSI等等。

对解析的结果进行判断,是不是一个合理的可打印字符,可打印字符最多的解码方式就是最可能的编码了。

如何判断可打印字符?流程如下:把解析好的字符串按照字符进行遍历,把每一个字符转化成Unicode编码,看看这些编码是不是Unicode的支持范围极客。

如果发现有种编码方式都是可打印字符,那么再使用本步骤:对字符串进行分词,分词这个在此不作赘述,你自己再研究一下。分词效果好的就是最可能的编码了。(不过通常到第三步就能搞定了,第四部绝大部分用不着)

以上就是关于JAVA获得字符串二进制码的问题 String.getBytes()问题全部的内容,包括:JAVA获得字符串二进制码的问题 String.getBytes()问题、怎么使用java判断一个字符串是属于什么编码、如何在JAVA中定义自己的字符集等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9679990.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存