Blogger Scott
一个utf8转换程序
据说是一个通用的手机上使用的UTF8转换程序,先记下来。
1
private
final
String readUnicodeFileUTF8(String filename)
{
2
StringBuffer sb
=
new
StringBuffer(
256
);
3
try
{
4
int
[] surrogatePair
=
new
int
[
2
];
5
InputStream is
=
this
.getClass().getResourceAsStream(filename);
6
7
int
val
=
0
;
8
int
unicharCount
=
0
;
9
while
((val
=
readNextCharFromStreamUTF8(is))
!=-
1
)
{
10
unicharCount
++
;
11
if
(val
<=
0xFFFF
)
{
12
//
if first value is the Byte Order Mark (BOM), do not add
13
if
(
!
(unicharCount
==
1
&&
val
==
0xFEFF
))
{
14
sb.append((
char
)val);
15
}
16
}
else
{
17
supplementCodePointToSurrogatePair(val, surrogatePair);
18
sb.append((
char
)surrogatePair[
0
]);
19
sb.append((
char
)surrogatePair[
1
]);
20
}
21
}
22
is.close();
23
}
catch
(Exception e)
{}
;
24
25
return
new
String(sb);
26
}
27
28
private
final
static
int
readNextCharFromStreamUTF8(InputStream is)
{
29
int
c
=
-
1
;
30
if
(is
==
null
)
return
c;
31
boolean
complete
=
false
;
32
33
try
{
34
int
byteVal;
35
int
expecting
=
0
;
36
int
composedVal
=
0
;
37
38
while
(
!
complete
&&
(byteVal
=
is.read())
!=
-
1
)
{
39
if
(expecting
>
0
&&
(byteVal
&
0xC0
)
==
0x80
)
{
/**/
/*
10xxxxxx
*/
40
expecting
--
;
41
composedVal
=
composedVal
|
((byteVal
&
0x3F
)
<<
(expecting
*
6
));
42
if
(expecting
==
0
)
{
43
c
=
composedVal;
44
complete
=
true
;
45
//
System.out.println("appending: U+" + Integer.toHexString(composedVal) );
46
}
47
}
else
{
48
composedVal
=
0
;
49
expecting
=
0
;
50
if
((byteVal
&
0x80
)
==
0
)
{
/**/
/*
0xxxxxxx
*/
51
//
one byte character, no extending byte expected
52
c
=
byteVal;
53
complete
=
true
;
54
//
System.out.println("appending: U+" + Integer.toHexString(byteVal) );
55
}
else
if
((byteVal
&
0xE0
)
==
0xC0
)
{
/**/
/*
110xxxxx
*/
56
expecting
=
1
;
//
expecting 1 extending byte
57
composedVal
=
((byteVal
&
0x1F
)
<<
6
);
58
}
else
if
((byteVal
&
0xF0
)
==
0xE0
)
{
/**/
/*
1110xxxx
*/
59
expecting
=
2
;
//
expecting 2 extending bytes
60
composedVal
=
((byteVal
&
0x0F
)
<<
12
);
61
}
else
if
((byteVal
&
0xF8
)
==
0xF0
)
{
/**/
/*
11110xxx
*/
62
expecting
=
3
;
//
expecting 3 extending bytes
63
composedVal
=
((byteVal
&
0x07
)
<<
18
);
64
}
else
{
65
//
non conformant utf-8, ignore or catch error
66
}
67
}
68
}
69
70
}
catch
(Exception e)
{
71
System.out.println(e.toString());
72
}
73
74
return
c;
75
}
76
77
private
final
static
void
supplementCodePointToSurrogatePair(
int
codePoint,
int
[] surrogatePair)
{
78
int
high4
=
((codePoint
>>
16
)
&
0x1F
)
-
1
;
79
int
mid6
=
((codePoint
>>
10
)
&
0x3F
);
80
int
low10
=
codePoint
&
0x3FF
;
81
82
surrogatePair[
0
]
=
(
0xD800
|
(high4
<<
6
)
|
(mid6));
83
surrogatePair[
1
]
=
(
0xDC00
|
(low10));
84
}
posted on 2009-06-07 16:37
江天部落格
阅读(292)
评论(0)
编辑
收藏
所属分类:
Android
、
Java
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
Android给scrollView截图超过屏幕大小形成长图
如何获得谷歌admob广告条的高度
Android开源库和开源资源
关于error: Error: String types not allowed (at 'configChanges' with value 'keyboard|keyboardHidden| orientation|screenLayout|uiMode|screenSize|smallestScreenSize').
[转]eclipse android工程没有错却出现红叉
转:android 调用系统的接口
Eclipse中导入android项目名前有红叉但项目内文件无错误问题解决方法
彩信阅读2.1.2版本上线--应网友morning要求,新增删除彩信功能。
Android Intent传递对象和ArrayList
Android事件处理模型二(基于监听接口的事件处理)
My Links
BlogJava
首页
联系
聚合
管理
Blog Stats
Posts - 75
Stories - 2
Comments - 32
Trackbacks - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(9)
给我留言
查看公开留言
查看私人留言
随笔分类
Android(43)
(RSS)
Apache(1)
(RSS)
Falsh(1)
(RSS)
Java(6)
(RSS)
Linux(3)
(RSS)
PALM OS(1)
(RSS)
php(1)
(RSS)
Prestashop(2)
(RSS)
RFID(1)
(RSS)
Windows(1)
(RSS)
Windows 11
(RSS)
微信公众号(1)
(RSS)
数据库(3)
(RSS)
综合类(6)
(RSS)
随笔档案
2024年4月 (1)
2015年10月 (1)
2015年6月 (1)
2015年4月 (3)
2013年10月 (5)
2013年1月 (1)
2012年10月 (1)
2012年3月 (2)
2012年2月 (2)
2011年11月 (2)
2011年10月 (1)
2011年6月 (1)
2011年5月 (3)
2011年1月 (1)
2010年12月 (5)
2010年11月 (3)
2010年3月 (1)
2010年2月 (7)
2010年1月 (4)
2009年12月 (1)
2009年8月 (2)
2009年6月 (4)
2009年5月 (6)
2008年11月 (1)
2008年8月 (1)
2008年2月 (1)
2007年11月 (1)
2007年5月 (1)
2007年4月 (1)
2006年10月 (2)
2006年9月 (1)
2006年8月 (3)
文章分类
Jetty(1)
(RSS)
PALM OS
(RSS)
原创文章
(RSS)
网上摘抄(1)
(RSS)
文章档案
2007年5月 (1)
2006年8月 (1)
相册
我的相册
相关链接
Android Plot
江天部落格
江天部落格
搜索
积分与排名
积分 - 247472
排名 - 230
最新随笔
1. 允许一个用户使用一个以上用户与服务器或共享资源的多重连接。中断与此服务器或共享资源的所有连接
2. jquery ui日期选择器 datepicker
3. Prestashop如何更改底部Powerdby信息
4. 网站自动跳转至http://wpkg.org原因及解决方法
5. 微信公众号获取access_token的PHP代码
6. Android给scrollView截图超过屏幕大小形成长图
7. 如何获得谷歌admob广告条的高度
8. Android开源库和开源资源
9. 关于error: Error: String types not allowed (at 'configChanges' with value 'keyboard|keyboardHidden| orientation|screenLayout|uiMode|screenSize|smallestScreenSize').
10. [转]eclipse android工程没有错却出现红叉
最新评论
1. 请问如何在自己的网站上禁用facebook的插件
请问如何在自己的网站上禁用facebook的插件
--liping rosy
2. re: Android短信备份 无法看到telephony
/data/data/com.android.providers.telephony/安卓4.2.2无法看到这个文件夹,求赐教!
--Ong
3. re: [转]eclipse android工程没有错却出现红叉[未登录]
与虚拟机有关,将虚拟机关掉就可以了
--jerry
4. re: Eclipse中导入android项目名前有红叉但项目内文件无错误问题解决方法
>工程在项目列表中删除(不从磁盘删除)并重新导入一次
这个就好了,我是真实用户
--tailor
5. re: Eclipse中导入android项目名前有红叉但项目内文件无错误问题解决方法
真的不错@tailor
--tailor
阅读排行榜
1. Android权限之sharedUserId和签名(29146)
2. Eclipse中导入android项目名前有红叉但项目内文件无错误问题解决方法(19043)
3. Installation failed due to invalid APK file!问题(16556)
4. SQLite中的时间日期函数(转)(14397)
5. Android短信备份(12864)
评论排行榜
1. Android短信备份(6)
2. Android彩信阅读软件MMSViewer,用Gphone看彩信手机报非常好用(5)
3. 彩信阅读2.1.2版本上线--应网友morning要求,新增删除彩信功能。(3)
4. 使用FileFilter查找文件系统(3)
5. 数据库表中插入重复数据的处理(3)