中文转换成ASCII码并用十六进制表示 (转)

中文转换成ASCII码并用十六进制表示

2010-08-24 14:50:20| 分类: 默认分类 |字号 订阅
由于我自己的毕业设计的需要,我需要在把用户输入的一个文本框中文字符提取出来,转换成像浏览器里地址栏里的ASCII码的十六进制的形式,在我完成之后,我顺便在网上找了一篇文章,是关于char和byte的转换,我觉得看看也许对以后碰到中文乱码有帮助,并复制下来了,我完成的代码如下:
package fish.utility;

//把中文转换成ASCII码,并用十六进制显示
plic class CoderUtils {

plic static int char2ASCII(char c) {
return (int) c;
}
//显示的是十进制
plic static int[] string2ASCII(String s) {// 字符串转换为ASCII码
if (s == null || "".eq ls(s)) {
return null;
}

char[] chars = s.toCharArray();
int[] asciiArray = new int[chars.length];

for (int i = 0; i < chars.length; i++) {
asciiArray[i] = char2ASCII(chars[i]);
}

return asciiArray;
}

//将十进制转换成十六进制
plic static String[] HexArray(int[] intArray){
String[] hexArray = new String[intArray.length];

for(int i=0;i<intArray.length;i++){
hexArray[i] = Integer.toHexString(intArray[i]).toUpperCase();
}
return hexArray;
}
plic static void main(String[] args) {

String s = "我们是五月的花朵";
String[] array = HexArray(string2ASCII(s));
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
}
}
ava byte与char互转原理
2009-03-09 17:47
一、字节和unicode

Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式是使用字节流的。因此Java要对这些字节流经行转化。 char是unicode的,而byte是字节。Java中 byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,可以用来告诉你,你用的 convertor。其中两个很常用的静态函数是:

plic static ByteToCharConverter getDefault();
plic static ByteToCharConverter getConverter(String encoding);


如果你不指定converter,则系统会自动使用当前的encoding,gb平台上用gbk,en平台上用8859_1。

byte ——〉char:
"你"的gb码是:0xc4e3 ,unicode是0x4f60
String encoding = "gb2312";
byte b[] = {(byte)'\?',(byte)'\?'};
ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding);
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}
结果是什么?0x4f60
如果encoding ="8859_1",结果又是什么?0x00c4,0x00e3


如果代码改为:

byte b[] = {(byte)'\?',(byte)'\?'};
ByteToCharConverter converter = ByteToCharConverter. getDefault();
char c[] = converter.convertAll(b);
for (int i = 0; i < c.length; i++) {
System.out.println(Integer.toHexString(c[i]));
}


结果将又是什么?

这就要根据平台的编码而定。

char ——〉byte:
String encoding = "gb2312";
char c[] = {'\你'};
CharToByteConverter converter = CharToByteConverter.getConverter(encoding);
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}
结果是什么?0x00c4,0x00e3
如果encoding ="8859_1",结果又是什么?0x3f
如果代码改为
String encoding = "gb2312";
char c[] = {'\你'};
CharToByteConverter converter = CharToByteConverter.getDefault();
byte b[] = converter.convertAll(c);
for (int i = 0; i < b.length; i++) {
System.out.println(Integer.toHexString(b[i]));
}


结果将又是什么?还是根据平台的编码而定。

很多中文问题就是从这两个最简单的类派生出来的。而却有很多类不直接支持把encoding输入,这给我们带来诸多不便。很多程序难得用encoding了,直接用default的encoding,这就给我们移植带来了很多困难。

二、utf-8

utf-8是和unicode一一对应的,其实现很简单:

7位的unicode: 0 _ _ _ _ _ _ _
11位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _
16位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _
21位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _


大多数情况是只使用到16位以下的unicode:

"你"的gb码是:0xc4e3 ,unicode是0x4f60
0xc4e3的二进制:
1100 ,0100 ,1110 ,0011


由于只有两位我们按照两位的编码来排,但是我们发现这行不通,因为第7位不是0因此,返回"?"

0x4f60的二进制:
0100 ,1111 ,0110 ,0000
我们用utf-8补齐,变成:
1110 ,0100 ,1011 ,1101 ,1010 ,0000
e4--bd-- a0
于是返回:0xe4,0xbd,0xa0。


三、string和byte[]

string其实核心是char[],然而要把byte转化成string,必须经过编码。string.length()其实就是char数组的长度,如果使用不同的编码,很可能会错分,造成散字和乱码。例如:

String encoding = “”;
byte [] b={(byte)'\?',(byte)'\?'};
String str=new String(b,encoding);


如果encoding=8859_1,会有两个字,但是encoding=gb2312只有一个字这个问题在处理分页是经常发生。

四、Reader,Writer / InputStream,OutputStream

Reader和Writer核心是char,InputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char读/写InputStream/OutputStream。例如:

文件test.txt只有一个"你"字,0xc4,0xe3
String encoding = "gb2312";
InputStreamReader reader = new InputStreamReader(new FileInputStream(
"text.txt"), encoding);
char c[] = new char[10];
int length = reader.read(c);
for (int i = 0; i < length; i++) {
System.out.println(c[i]);
}


结果是什么?是"你"。如果encoding ="8859_1",结果是什么?"??"两个字符,表示不认识。反过来的例子自己做。
五、我们要对Java的编译器有所了解:

Javac ?encoding


我们常常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。如果没有指定encoding,则按照系统的默认 encoding,gb平台上是gb2312,英文平台上是iso8859_1。Java的编译器实际上是调用sun.tools.Javac.main 的类,对文件进行编译,这个类有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。编译器就是根据这个变量来读取Java文件的,然后把用utf-8形式编译成class文件。例子代码:

String str = "你";
FileWriter writer = new FileWriter("text.txt");
write.write(str);
writer.close();

如果用gb2312编译,你会找到e4 bd a0的字段 ;
如果用8859_1编译, 00c4 00e3的二进制:
0000,0000 ,1100,0100 ,0000,0000 ,1110,0011
因为每个字符都大于7位,因此用11位编码:
1100,0001,1000,0100,1100,0011,1010,0011
c1-- 84-- c3--  a3
你会找到c1 84 c3 a3


但是我们往往忽略掉这个参数,因此这样往往会有跨平台的问题:

样例代码在中文平台上编译,生成zhclass

样例代码在英文平台上编译,输出enclass

(1) zhclass在中文平台上执行ok,但是在英文平台上不行

(2) enclass在英文平台上执行ok,但是在中文平台上不行

原因是:

(1) 在中文平台上编译后,其实str在运行态的char[]是0x4f60, 在中文平台上运行,filewriter的缺省编码是gb2312,因此 chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream 中,于是0xc4,0xe3放进了文件。但是如果是在英文平台下,chartobyteconverter的缺省值是8859_1, filewriter会自动调用8859_1去转化str,但是他无法解释,因此他会输出"?"

(2) 在英文平台上编译后,其实str在运行态的char[]是0x00c4 0x00e3, 在中文平台上运行,中文无法识别,因此会出现??;在英文平台上,0x00c4-->0xc4,0x00e3->0xe3,因此 0xc4,0xe3被放进了文件。

六、其它原因:

<%@ page contentType="text/html; charset=GBK" %>


设置浏览器的显示编码,如果response的数据是utf8编码,显示将是乱码,但是乱码和上述原因还不一样。

七、发生编码的地方:

1. 从数据库到Java程序 byte——〉char

2. 从Java程序到数据库 char——〉byte

3. 从文件到Java程序 byte——〉char

4. 从Java程序到文件 char——〉byte

5. 从Java程序到页面显示 char——〉byte

6. 从页面form提交数据到Java程序byte——〉char

7. 从流到Java程序byte——〉char

8. 从Java程序到流char——〉byte

可以使用配置过滤器的方法解决中文乱码的:

<web-app>
<filter>
<filter-name>ReqstFilter</filter-name>
<filter-class>net.golden.uirs.util.ReqstFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-val>gb2312</param-val>
</init-param>
</filter>
<filter-mapping>
<filter-name>ReqstFilter</filter-name>
<url-pattern>*.Jsp</url-pattern>
</filter-mapping>
</web-app>


plic void doFilter(ServletReqst req, ServletResponse res,
FilterChain fChain) throws IOException, ServletException {
HttpServletReqst reqst = (HttpServletReqst) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = reqst.getSession();
String userId = (String) session.getAttribute("userid");
req.setCharacterEncoding(this.filterConfig.getInitParameter("charset"));
// 设置字符集?
//实际上是设置了byte ——〉char的encoding
try {
if (userId == null || userId.eq ls("")) {
if (!reqst.getReqstURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\\x2EJsp$")) {
session.invalidate();
response.sendRedirect(reqst.getContextPath() +
"/uirs/logon/logon.Jsp");
}
}
else {
// 看看是否具有信息上报系统的权限
if (!net.golden.uirs.util.UirsChecker.check(userId, "信息上报系统",
net.golden.uirs.util.UirsChecker.ACTION_DO)) {
if (!reqst.getReqstURL().toString().matches(
".*/uirs/logon/logon(Controller){0,1}\\x2EJsp$")) {
response.sendRedirect(reqst.getContextPath() +
"/uirs/logon/logonController.Jsp");
}
}
}
}
catch (Exception ex) {
response.sendRedirect(reqst.getContextPath() +"/uirs/logon/logon.Jsp");
}
TIA博途_S7-1200中将BYTE类型的数据char类型的具体方法和注意事项 阅读详情

相关推荐

将BYTE类型数据换为char类型的方法和注意事项

在本文中,我们将讨论如何将BYTE类型的数据换为char类型的数据,并提供相应的源代示例。这种方法不会导致数据截断,但是需要注意的是,char类型仍然是有符号的,所以在使用换后的char类型数据时要小心。请注意,这种换可能会导致数据的截断,因为char类型是有符号的,而BYTE类型是无符号的。因此,在执行类型换之前,我们需要确保BYTE类型的数据在char类型的取值范围内。因此,在进行换之前,要确保BYTE类型的数据在char类型的取值范围内,否则可能会导致数据截断。换为char类型的变量。

ZwdvIot的博客 2390

ByteToCharConverter.java

ByteToCharConverter.javaByteToCharConverter.javaByteToCharConverter.javaByteToCharConverter.javaByteToCharConverter.java

ASCII十六进制的完整实现指南

Python提供了多种数据类型来处理数值,包括整型(int)、浮点型(float)、复数(complex)和布尔型(bool)。整型和浮点型是最常用的两种数值类型。整型(int)可以是任意大小的整数,包括负数。浮点型(float)表示带有小数点的数值,并可以包含小数部分。除了标准的数值类型外,Python还提供了多个内置函数来处理数值的换和计算,如int()float()complex(), 和round()

weixin_30205153的博客 1269

java bytechar互原理-

一、字节和unicode Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式是使用字节流的。因此Java要对这些字节流经行化。 char是unicode的,而byte是字节。Java中 byte/char互的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,可以用来告诉你,你用的 convertor。其中两个很常...

毛毛帅 1240

charbyte类型

char化为byte: public static byte[] charToByte(char c) { byte[] b = new byte[2]; b[0] = (byte) ((c &amp; 0xFF00) &gt;&gt; 8); b[1] = (byte) (c &amp; 0xFF); ...

4282

十六进制ASCII

记录一下自己在做项目的时候遇到的问题: 芯片传回来的数据是以十六进制表示的,但是我想要把这十六进制代表的数据通过UART发送到电脑上表示出来,所以最终要求就是将十六进制表示的数据用ASCII表示传给电脑。 但是所用的单片机又调不出sprintf函数… 后面发现从HEXASCII很难直接实现,所以便想到:HEX—>BCD,BCD—>ASCII //==================...

九幽小班的博客 1万+

ASCII对应表,ASCII值的大小顺序

刚开始基础计算机编程的时候,学习的是二进制、十进制、十六进制。 十进制是生活习惯中最常用的计数方法,也是我们计数的思维逻辑。 后来接触了计算机基础,我们知道计算机都是用二进制表示的,但是这种表示方法让人理解很困难。 因此人们编制了统一的信息交换代,也就是ASCII表,它的全称是“美国信息交换标准代” 详细的ASCII 表见下: 如上表:每一个ASCII 都有3部分组. ASCII值、16进制、控制字符。 其中ASCII值就是控制字符对应的十进制数值,16进制和ASCII值是对应的.

无际单片机编程 8万+

常见字符的ASCIIjava中如何获取字符的ASCII

一、常见字符的ASCII ASCII 使用指定的7 位或8 位的二进制数组合来表示128 或256 种可能的字符。 标准ASCII 也叫基础ASCII,使用7 位二进制数(最高的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制符号。具体对照情况如下表。这128个字符可以分为以下两种: (使用ASCII对应的十进制数表示顺序) 1...

daimadog的博客 4万+

ASCII详解

ASCII简介 ASCII 使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 也叫基础ASCII,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:   0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF...

zisongjia的博客 3万+

ASCII对照表(十进制和十六进制

表 A-1 DEC 多国字符集 十六进制 MCS 字符或缩写 DEC 多国字符名 ASCII 控制字符 1 ...

weixin_30362233的博客 2万+

ASCII表、ASCII扩展表

ASCII控制符号(不可打印字符,范围0~31及 127) 二进制 十进制 十六进制 缩写 Unicode 表示法 脱出字符 表示法 名称/意义 00000000 0 00 NUL ␀ ^@ 空字符(Null) 00000001 1 01 SOH ␁ ^A 标题...

cmfu9999的专栏 1万+

数字0123456789对应的ASCII

做开发的时候经常会遇到需要用ASCII表示数字,或者由ASCII查找对应的数字 每个数字对应一个ASCII值,也就十个值,但是记不住,每次都要百度查表 这里做个记录以备下次用到,也方便大家查询 Bin(二进制) Oct(八进制) Dec(十进制) Hex(十六进制) 缩写/字符 ...

野猿新一 8万+

换行、回车、空格等常用的ASCII

换行符的ASCII值为10,十六进制表示为0x0A 回车符的ASCII值为13,十六进制表示为0x0D 空格符的ASCII值为32十六进制表示为0x20 以下列出其他一些常用到的符号的ASCII 二进制 八进制 十进制 十六进制 缩写/字符 解释 ...

野猿新一 8万+

Qt将QStringASCII

Qt将QStringASCII 原理很简单,获取字符串的UTF-8编,然后逐个读取强int类型即可。 QString s = "Three Second 三秒"; QByteArray byte = s.toUtf8(); for(int i = 0; i < s.size(); i++) { qDebug() << int(byte.at(i)...

《好好先生》专栏 2万+

ascii十六进制表示法 - URL

近日得到一个可以发送短信的方法,通过URL编传递文字,因此找到od命令用户用于文字格式。   od 单行: echo "阿道夫"|od -t x1 -A n -v -w10000000000 | tr " " % 输出:%b0%a2%b5%c0%b7%f2%0a 多行: echo -e "阿道夫\n测试"|od -t x1 -A n -v

chentaocba的专栏 4789

LabVIEW实现十六进制ASCII完整项目实战

LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是由美国国家仪器公司(National Instruments, NI)开发的一款基于图形化编程语言G语言的集开发环境,广泛应用于测试测量、自动化控制、数据采集分析等领域。相较于传统的文本式编程语言如C、Python或Java,LabVIEW通过“图标+连线”的方式实现程序逻辑的构建,极大地降低了工程人员进入编程领域的门槛,同时提升了复杂系统建模的可视化程度和调试效率。

weixin_35755562的博客 1058

BCDASCII的相互

BCDASCII的相互换 最近遇到一个问题就是将BCDASCII互换的问题,题目如下: 两位BCD数以压缩形式存入30H单元,用汇编语言实现将这两个BCD变为ASCII,并且保存在40H和41H中。 根据以上问题首先要知道什么是BCD和什么是ASCII。 1、首先BCD同时也叫二进十进数,通俗点就是用4位二进制数来表示0~9这10个十进制数,BCD可以分为有权和无权...

SZU_黄其才 3万+

ASCII十六进制,十进制数;十六进制字符值十进制,ASCII

用字符表示十六进制化为十进制,ASCII: bool ok; QStringList list; //初始化list的内容为:list = ("30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "43", "44", "4D", "4E") //初始化list for(int i =0 ;i<10;i++) {...

草莓蛋糕人 1万+
上一篇: OSGI错误分析解决
下一篇: 数据同步时过滤掉临时表(转)
fs20041242
博客等级 码龄19年 1粉丝 47原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值