javajava读取字符串长度输出

编程算法(104)
java中逐个输出字符串
/link?url=mCAMXSd_LFjUEmv7Kf2rWbXZJq_KJlZqSIRwngP05jLp8Gcnv25hIO4w1wgGcjF6WwP105BQHWT2Oe9TMY-J2a
在JAVA中输出字符串时可不可以像FLASH 那样把字符逐个逐个缓慢输出(也就是打字效果)。要是可以的话 请赐教 谢谢
提问者采纳
public class Temp
public static void main(String[] args) throws InterruptedException
String s = &asdfdfwefwgggvbcvbcv&;
for (int i = 0; i & s.length(); i++)
System.out.print(s.charAt(i));
Thread.sleep(1000);//输一个停一秒
提问者评价
谢谢 正是我想要的
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:44189次
排名:千里之外
转载:250篇
(2)(12)(19)(19)(10)(8)(178)(2)(3)(2)(2)Java数组不能通过toString方法转为字符串_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Java数组不能通过toString方法转为字符串
来源:Linux社区&
作者:ningvsban
Java里,所有的类,不管是Java库里面的类,或者是你自己创建的类,全部是从object这个类继承的。object里有一个方法就是toString(),那么所有的类创建的时候,都有一个toString的方法。
这个方法是干什么的呢?
首先我们得了解,Java输出用的函数print();是不接受对象直接输出的,只接受字符串或者数字之类的输出。那么你想把一个创建好的对象拿来输出怎么办?例如:
package com.spring.h3;
public class Test2 {& & public static void main(String[] args) {& & & & System.out.println("new Test2()==="+new Test2());& & & & //输出结果为:new Test2()===com.spring.h3.Test2@18a992f& & }}
按照print接受的类型来说,s1是不能直接输出的,那么是否代表这个是不能编译运行的呢?当然不是。因为当print检测到输出的是一个对象而不是字符或者数字时,那么它会去调用这个对象类里面的toString 方法,输出结果为[类型@哈希值]。Object类中的toString()方法的源代码如下:
/**&* Returns a string representation of the object. In general, the &* &code&toString&/code& method returns a string that &* "textually represents" this object. The result should &* be a concise but informative representation that is easy for a &* person to read.&* It is recommended that all subclasses override this method.&* &p&&* The &code&toString&/code& method for class &code&Object&/code& &* returns a string consisting of the name of the class of which the &* object is an instance, the at-sign character `&code&@&/code&', and &* the unsigned hexadecimal representation of the hash code of the &* object. In other words, this method returns a string equal to the &* value of:&* &blockquote&&* &pre&&* getClass().getName() + '@' + Integer.toHexString(hashCode())&* &/pre&&/blockquote&&*&* @return& a string representation of the object.&*/public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());}
而数组类中并没有对此方法重写(override),仅仅是重载(overload)为类的静态方法(参见java.util.Arrays)。所以,数组直接使用toString()的结果也是[类型@哈希值]。
  所以数组转为字符串应写成:
Arrays.toString(a) 
  这种方法的toString()是带格式的,也就是说输出的是[a, b, c],如果仅仅想输出abc则需用以下两种方法:
  方法1:直接在构造String时转换。
char[] data = {'a', 'b', 'c'};
String str = new String(data);
  方法2:调用String类的方法转换。
String.valueOf(char[] ch)
本文永久更新链接地址:
相关资讯 & & &
& (12/02/:19)
& (01/04/:29)
& (03月01日)
& (05/15/:05)
& (05/20/:45)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款Java里的字符串, String类简单介绍.
我的图书馆
Java里的字符串, String类简单介绍.
String类在java面试中也是1个常见的问题点. 所以也是写在这里方便以后查阅了.
大家都知道c语言里是没有String 字符串这个数据类型的.
只能用字符数组的1个特殊形式来表示一个字符串, 就是这个字符数组的最后1元素必须是以'\0'(空) 来结尾的.
char c[] = "abcd" 是1个字符串, 但是它的长度是5, char[4] = '\0'
char d[6] = "abcde" 也是1个字符串.
但是, char e[5] = "abcde" 只是1个字符数组, 因为它最后1个元素不是 = "\0" ,如果对字符数组e执行string.h里面的函数的话, 就肯定会出错了.
因为检测不到'\0'字符啊.
当然, 用c语言写1个字符串容器不难.& 而java是由c语言发展而来, sun公司已经帮我们写好了1个字符串容器, 这个容器就是String类了.
一, Java里的字符串.
1.1 字符串跟String类是不同的概念
本文涉及两个重点,& 1个是字符串, 1个是String类. 它们虽然有联系, 但是却是完全不同的两个概念!
我们可以参考jdk api中文里对String类的解释:
public final class String
extends Object
implements Serializable, Comparable&String&, CharSequence
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
由上面的解析我们见到几个不易理解的地方:
字符串是常量?
它们的值不能改?
因为..所以..& 这什么逻辑?
在实际编程当中, 我们觉得字符串变量的值可以更改的呀?
本人认为, 大家没必要担心自己的理解能力, 中文jdk api的翻译实在是很没有节操的.
上面解释的最后一句话的原文是这样的:
Strings their values cannot be changed after they are created.String buffers support mutablestrings.
Because String objects are immutable they can be shared
字符串是常量; 它们的值一旦创建不能更改. 然而String类的引用(变量 or 内存)却可以指向不同的字符串. 是因为字符串对象虽然是不能修改的,
但是它们的地址可以共享.
原文和本人翻译都有两种颜色的单词,& 红色就是指上面第一个概念字符串.& 而蓝色指的另1个概念String类.
相信即使本人修改了翻译, 仍然会有人觉得还是不能理解, 请往下看:
1.2 java里字符串的定义
注意这个不是String类的定义哦, 定义如下:
Java里的字符串就是存放于数据区(静态区)以Unicode编码的字符集合.
可见java里的字符串跟c语言的字符串如下两个本质上的区别:
1.2.1 Java里字符串用Unicode编码
c语言中的字符串里面的字符串是用ASCII编码的, ASCII只用1个字节(byte)的内存表示1个字符. 但是1个字节的内存数量不足以表示全世界那么多种字符.
例如1个汉子就需要2个字节来表示.
所以c语言里的某些字符处理函数, 如果参数传入1个汉字可能就会出错, 因为毕竟字符的占用内存长度不同.
而Unicdoe也叫万国码, 它用两个字节去表示任何1个字节, 无论是字母还是汉字. 所以利用java来做内存处理更加方便, 跨平台性非常好.
缺点就是比c语言字符处理更加耗内存.
1.2.2 Java里字符串存放在数据区(静态区).
我之前的博文见过, java程序类似于c语言, 运行时会把程序占用的内存大致分割成几个部分.
stuck(栈区), Heap(堆区), Data(数据区)和代码区&
其中数据区用于存放静态变量和字符串常量.
一, Java里的字符串.
1.3 为什么说java里的字符串是常量, 不可修改的.
1.3.1 一般的类指向的是变量
关于这点, 需要对比才能讲得清楚.
这里我们利用1个自定的类来举个例子:
[java] package&String_&&&&class&Human_1{&&&&&&int&&&&&&&int&&&&&&&public&Human_1(int&id,&int&age){&&&&&&&&&&this.id&=&&&&&&&&&&&this.age&=&&&&&&&}&&&&&&public&String&toString(){&&&&&&&&&&return&"id&is&"&+&id&+&","&&+&"&age&is&"&+&&&&&&&}&&}&&&&public&class&String_2{&&&&&&public&static&void&f(){&&&&&&&&&&Human_1&h&=&new&Human_1(1,30);&&&&&&&&&&Human_1&h2&=&h;&//&&&&&&&&&&System.out.printf("h:&%s\n",&h.toString());&&&&&&&&&&&System.out.printf("h2:&%s\n\n",&h.toString());&&&&&&&&&&&&&h.id&=&3;&&&&&&&&&&h.age&=&32;&&&&&&&&&&System.out.printf("h:&%s\n",&h.toString());&&&&&&&&&&&System.out.printf("h2:&%s\n\n",&h.toString());&&&&&&&&&&&&&System.out.println(&h&==&h2&);&&&&&&}&&}&&
上面例子中定义了1个Human_1的类, 只有2个成员id和age.
下面f()中首先实例化了1个Human_1的对象h.
然后定义另外1个引用h2, 然后把h的地址赋予给h2 ( Human_1 h2 = h)
然后输出h, h2的值, 它们是一样的.
然后修改h的值,
再次输出h h2的值, 发现h2的值也被修改.
最后用 " == " 来比较h 和 h2所指向的地址.
明显它们两者所指向的地址是相同.
[java] [java]&h:&id&is&1,&age&is&30&&[java]&h2:&id&is&1,&age&is&30&&[java]&&&[java]&h:&id&is&3,&age&is&32&&[java]&h2:&id&is&3,&age&is&32&&[java]&&&[java]&true&&
其实上面例子可以理解成:
首先用1个容器h2 来保存 h1所指向的地址.
然后修改h1的值, 最后h1的地址没变化.
h这个对象虽然值被修改了, 但是指向的内存地址没有变化, 变的是该内存的内容(值)
画张图便于理解:
如上图可见:
1& 对象名h 和 h2 本身是都是局部变量, 位于栈区中, 里面存放的是1个地址.
2. 该地址指向的是堆区的一块内存, 这块内存是用new Human()划分出来的. 而且把头部地址赋予对象名h
3. 该内存包括两个部分, 1个用于存放成员id的值, 另1个存放成员age的值.
可见, 无论对象h成员的值如何改变, 变的只是堆区内存的存放内容, 而堆区内存地址是没变化的. 对象引用h的指向也没有变化.
我们一般把这种内存地址不变, 值可以改变的东西成为变量.
意思就是内存地址不变的前提下内存的内容是可变的.
注意, 上面的例子不说是对象引用h是1个变量,& 而是说h指向的内存是1个变量
1.3.2 java里的字符串是常量
将上面的例子改一下, 把Human_1类改成String类:
[java] package&String_&&&&public&class&String_3{&&&&&&public&static&void&f(){&&&&&&&&&&String&s&=&"cat";&&&&&&&&&&String&s2&=&s;&&&&&&&&&&&&System.out.printf("s:&%s\n",&s);&&&&&&&&&&&System.out.printf("s2:&%s\n",&s2);&&&&&&&&&&&System.out.println(s&==&s2);&&&&&&&&&&&&&s&=&"dog";&&&&&&&&&&System.out.printf("\ns:&%s\n",&s);&&&&&&&&&&&System.out.printf("s2:&%s\n",&s2);&&&&&&&&&&&System.out.println(s&==&s2);&&&&&&&}&&}&&
逻辑跟上面的例子基本没区别, 也是首先实例化1个String对象s, 它的值是s;
然后将s所指向的地址保存在另个引用s2.
这时输出s 和 s2的值, 它们当然是相等的.
这时"修改"s的值为"dog"
再输出s 和 s2的值, 却发现s的值变成dog了, 但是s2的值还是cat..& 而且它们的所指向的地址也不再相等.
[java] [java]&s:&cat&&[java]&s2:&cat&&[java]&true&&[java]&&&[java]&s:&dog&&[java]&s2:&cat&&[java]&false&&
为什么s 和 s2所指向的地址一开始是相等的, 一旦s的修改为dog后, s 和 s2所指向的地址就不等呢.
原因就是这句代码:
s = "dog";&
并不是修改s所指向的内存地址, 而是改变了s的指向, 也就是修改了s的所指向的地址啊.
s的值"修改"前:
由上图可见:
1. String类也是java的类, 所以它的实例化对象也需要在堆区划分内存。
2. 两个对象引用s 和 s2这时都指向了堆区同1块对象内存。所以它们的所指向地址是相等的。
3. 字符串真正的地址不是再堆区中, 是在数据区中的。 而堆区对象内存中有其中1个对象成员保存了该字符串在数据区的真正地址。
s的值"修改"为dog后:
由上图可见:
1. s = "dog" 并不是修改s所指向的内容. 而是在堆区和数据区各划分了1个新的内存. 其中数据区划分1个新的字符串"dog" , 堆区划分1个新的String对象内存, 保存了dog的字符串地址.
2. 当然之前那个堆区对象内存和数据"cat"的内存是由 String s = "cat" 这条语句创建,关于String类语法机制后面会再讲。
3. s = "dog" 不但在数据区和堆区都各自创建1个新内存, 而且还改变了自己所指向的地址, 所以这时s 和 s2 不再相等.
4. 关键是原来数据的字符"cat" 并没有被修改! 也不可能被修改.
我们一般把这种内存值不能改变, 只能通过引用去指向另1块的东西叫做常量.
1.3.3 java里字符串不能修改的一些小结.
其实从另外一些方面一也能体现出java字符串不能修改的.
例如一些java的内部类, 如Calendar(日期)一般都会提供一些setXXXX的方法让程序猿去修改对应的值. 例如 setYear(), setDate().等等
而String类是没有这类setXXXX方法.
虽然字符串在数据区中的内存不能修改, 但是我们可以为String类的对象指向另一块内存. 所以这个特性在编程造成的影响不大.
那么原来的内存怎么办呢? 放心, java的内存回收机制会收拾它们的..
二, Java里的String类.
2.1 java里 String 类的 本质
String类的书面解释在本文的1.1 章里提高过了, 是1个用于字符串的类.
但是这个解释并没有指明String类的本质.
我们知道, Java类的本质大致上可以理解为 成员(属性) 和 方法的集合体.
String类也一样, 只不过String类有1个关键的成员, 这个成员保存着数据区的某个字符串的内存地址. 可以理解为1个指针.
而String类的方法是一些对对应字符串的查询方法(例如indexOf(), charAt()等). 注意, 并没有对这个字符串进行修改的方法哦, 字符串是常量, 不能修改.
虽然String类不能修改字符串, 但是上面保存字符串地址的成员却是可以被改变的, 也就是说String类的对象可以指向另1个字符串.
见上图, java的String类实例化1个对象后, 会在堆区划分一块对象的内存, 其中1个关键成员存放的是数据区字符串的地址.
而下面若干个方法内存, 存放的是该函数(方法)在代码区的2进制代码的地址.
2.2 String类实例化对象的第一个方法. new String("abc")
当然, String类的构造函数有很多个(参数不同), 但是在coding中,常用的实例化对象方法无非是两种.
第一种就是与其他类一样, 利用构造方法.
[java] String&s&=&new&String("abc");&&
上面的代码做了下面若干个事情.
1. 在数据区中划分一块内存存放字符串, 值是"abc", 这块内存一旦创建, 值"abc" 不能被修改.
2. 在堆区划分1块对象内存, 其中小块用于存放上面字符串的地址, 另一些用于存放函数指针.
3. 在栈区划分一块内存, 存放上面堆区的头部地址.
下面是1个例子:
[java] package&String_&&&&public&class&String_4{&&&&&&public&static&void&f(){&&&&&&&&&&String&s&=&new&String("cat");&&&&&&&&&&String&s2&=&new&String("cat");&&&&&&&&&&&&System.out.printf("s:&%s\n",&s);&&&&&&&&&&&System.out.printf("s2:&%s\n",&s2);&&&&&&&&&&&System.out.println(s&==&s2);&&&&&&&&&&&System.out.println(s.equals(s2));&&&&&&}&&}&&
上面利用new 实例化了两个对象s和s2 , 它们所指向的字符串值都是"cat"
然后用 "==" 和 equals来比较两者
[plain] [java]&s:&cat&&[java]&s2:&cat&&[java]&false&&[java]&true&&
可见用equals 来比较s 和 s2, 它们是相等的, 因为它们的内容相同. 而且equals方法在String类里重写过了.
而用 "==" 比较的是两个对象s 和 s2所指向的地址, 它们所指向的地址是不同的.
亦即系讲, 两个new语句分别在数据区和堆区各自都划分2个内存.
数据区中有两个字符串内存, 它们的值是一样的都是"cat".
堆区有两个对象内存, 它们分别保存了各自对应的字符串地址.
而stuck区中两个s1 s2 保存了各自的堆区内存地址.& 这两个地址明显是不同的. 也就是 s == s2 返回false的原因.
2.3 String类实例化对象的另一个方法.& = "abc"
事实上, 我们在编程中新建1个字符串更多情况下会用如下的方式:
[java] String&s&=&"abc";&&
这种方式更上面那种有什么区别呢?
[java] package&String_&&&&public&class&String_5{&&&&&&public&static&String&g(){&&&&&&&&&&String&s4&=&"cat";&&&&&&&&&&return&s4;&&&&&&}&&&&&&&&public&static&void&f(){&&&&&&&&&&String&s&=&new&String("cat");&&&&&&&&&&String&s2&=&"cat";&&&&&&&&&&String&s3&=&"cat";&&&&&&&&&&System.out.printf("s:&%s\n",&s);&&&&&&&&&&&System.out.printf("s2:&%s\n",&s2);&&&&&&&&&&&System.out.printf("s3:&%s\n",&s3);&&&&&&&&&&&&&&&&&&&&&System.out.println(s&==&s2);&&&&&&&&&&&System.out.println(s2&==&s3);&&&&&&&&&&&System.out.println(s2&==&g());&&&&&&&}&&}&&
这个例子步骤也不复杂:
首先f()方法里 利用第一种方法实例化了1个值为"cat"的对象s
然后里利用第二种方法 又 创建了两个String 对象s2 和 s3, 它们的值都是"cat".
然后用"==" 来比较它们.
然后f()方法调用g()方法, g()方法利用第二方式实例化了1个值为"cat"的String 对象s4
最后用 "==" 比较s2 和 s4 的地址.
[plain] [java]&s:&cat&&[java]&s2:&cat&&[java]&s3:&cat&&[java]&false&&[java]&true&&[java]&true&&
由结果得知, s4 和 s2 和 s3的地址是相同的! 而由第一种方法创建的s 跟前面三者地址不同.
所以结论如下:
利用 = "cat" 方式创建1个String对象时, java 首先会检测当前进程的数据区是否有1个以相同方式创建的值是一样的字符串存在.
如果无, 则类似 new Sring("cat")方式, 在数据区和堆区都各自划分一块新内存, 用于该创建的对象.
如果有, 则直接把该对象的地址指向 已存在的堆区内存地址.
也就是讲, 在f() 里的String s2 = "cat" 相当于执行了 String s2 = new String("cat");
而在f()里的 String&& s3 = "cat" 相当执行了String s3 = s2;
而在g()里, 理论上g()是不能访问f()里的 局部变量的, 但是g()还是检测到数据区存在用相同方式创建而且值1个样的字符串.
所以s4 也指向了堆区的那一块内存.
这个例子说明了, 在同1个java程序中, 所有用 " = "abc" " 方式创建的而且具有相同值的多个String对象其实都是同1个对象. 因为它们指向同一块堆区的内存.
由于这种特性, 所以这种用" = "abc"" 方式创建的对象十分适合做 synchronized对象锁 要锁的对象.&& 不用担心锁的是两个不同的对象导致 多线程同步失败.
三, String类的常用方法.
下面是应付面试的, 大家看看就好.
public char charAt(int index) //返回字符串中第index个字符
public int length()& //返回字符串的长度
public int indexOf(String str)
返回字符串中出现str的第1个位置
public int indexOf(String str, int fromIndex)
返回字符串中, 从第fromIndex个字符数起, 出现str的第1个位置, 这个方法是上面方法的重载
public boolean equalsIgnoreCase(String str)
忽略大小写, 比较两个字符是否相等.
public String replace(char oldChar, char newChar)
返回1个新字符串, 该新字符串内的oldChar被newChar替换掉, 注意旧字符串没有被修改.
public boolean startsWith(String prefix)
判断字符串是否以 prefix 开头
public boolean endsWith(String suffix)
判断字符产是否以suffix 结尾
public String subString(int beginIndex)
截取从第beginIndex个字符开始到最后1个字符, 返回1个新字符串
public String subString(int beginIndex, int endIndex)
截取从第beginIndex个字符开始, 第endIndex个字符, 返回1个新字符串, 是上面方法的重载
public static String valueOf(...)
注意这个是静态方法. 可以把其他基本数据类型转换成String对象
Integer.parseInt(String s)
这个是另1个类Integer 的敬爱函数, 可以把字符串转换成int类型.& 会抛出异常..
TA的最新馆藏
喜欢该文的人也喜欢博客访问: 521965
博文数量: 188
博客积分: 1992
博客等级: 上尉
技术积分: 1765
注册时间:
重庆乐潮信息技术有限公司
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Java
http://blog.csdn.net/zhouyong80/article/details/1900100无论是对程序的本地化还是国际化,都会涉及到字符编码的转换的问题。尤其在web应用中常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为GBK或者GB2312。
一、关键技术点:&&& 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)”构造方法用于把字节数组按指定的格式组合成一个字符串对象&&& 二、实例演示:&
package&book.Simport&java.io.UnsupportedEncodingE/**&*&转换字符串的编码&*&@author&joe&*&*/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);&&&&}}
输出结果:
str:This&is&a&中文的&String!转换成GBK码:This&is&a&中文的&String!转换成US-ASCII:This&is&a&??????&String!转换成ISO-<span style="COLOR: #59-<span style="COLOR: #码:This&is&a&??????&String!再把ISO-<span style="COLOR: #59-<span style="COLOR: #码的字符串转换成GBK码:This&is&a&中文的&String!转换成UTF-<span style="COLOR: #码:This&is&a&?????&String!转换成UTF-<span style="COLOR: #BE码:周楳?猠愠????瑲楮朡再把UTF-<span style="COLOR: #BE编码的字符转换成GBK码:This&is&a&中文的&String!转换成UTF-<span style="COLOR: #LE码:桔獩椠?????匠牴湩Ⅷ再把UTF-<span style="COLOR: #LE编码的字符串转换成GBK码:This&is&a&中文的&String!转换成UTF-<span style="COLOR: #码:周楳?猠愠????瑲楮朡再把UTF-<span style="COLOR: #编码的字符串转换成GB2312码:?This&is&a&中文的&String!
三、源码分析:&&& 更改字符串编码的步骤为:&&& 1、调用String的getByte方法对字符串进行解码,得到字符串的字节数组(字节数组不携带任何有关编码格式的信息,只有字符才有编码格式)&&& 2、根据字节数组和新的字符编码构造一个新的String对象,得到的就是按照新的字符编码生成的字符串
阅读(19285) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 string倒叙输出 的文章

 

随机推荐