`
philip01
  • 浏览: 47125 次
  • 来自: ...
社区版块
存档分类
最新评论

utf

阅读更多

package com;

public class UTF8Tester {

 private static String HEX = "0123456789ABCDEF";

 private static String toBin(int n) {
  StringBuffer stringBuffer = new StringBuffer();
  n = n & 0x000000FF;

  for (int i = 7; i >= 0; i--) {
   if (1 == ((n >> i) & 1)) {
    stringBuffer.append('1');
   } else {
    stringBuffer.append('0');
   }
  }

  return stringBuffer.toString();
 }

 private static String toHex(int n) {
  StringBuffer stringBuffer = new StringBuffer();
  n = n & 0x000000FF;
  stringBuffer.append(HEX.charAt(n >> 4));
  stringBuffer.append(HEX.charAt(n & 0x0F));
  return stringBuffer.toString();
 }

 private static void printUTF8(char ch) throws Exception {
  String unicode = toHex(ch >> 8) + toHex(ch & 0xFF);
  String unicodeBin = toBin(ch >> 8) + ' ' + toBin(ch & 0xFF);

  String s = "" + ch;
  byte[] b = s.getBytes("UTF-8");

  String hex = "";

  for (int i = 0; i < b.length; i++) {
   hex += toHex((int) b[i]);
   hex += " ";
  }

  String bin = "";
  for (int i = 0; i < b.length; i++) {
   bin += toBin((int) b[i]);
   bin += " ";
  }
  String sf = String.format("U+%s %s : %-8s : %s", unicode, unicodeBin,
    hex.trim(), bin.trim());
  System.out.println(sf);

 }

 public static void main(String[] args) throws Exception {

  System.out.println("");
  printUTF8('\u002A');
  printUTF8('\u012A');
  printUTF8('\u012B');
  printUTF8('\u052C');
  printUTF8('\u013C');
  printUTF8('\uAA2A');
  printUTF8('\uFDFD');
  
 }

}

 

 

 

package com;

import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;

public class Utf8Utils {  
  
     private final static byte B_10000000 = (byte)0x80;  
     private final static byte B_11000000 = (byte)0xc0;  
     private final static byte B_11100000 = (byte)0xE0;  
     private final static byte B_11110000 = (byte)0xf0;  
     private final static byte B_00011100 = (byte)0x1C;  
     private final static byte B_00000011 = (byte)0x03;  
     private final static byte B_00111111 = (byte)0x3F;  
     private final static byte B_00001111 = (byte)0xf;  
     private final static byte B_00111100 = (byte)0x3c;  
       
     /** Convert from UTF8 bytes to UNICODE character */ 
     public static char[] toUCS2(byte[] utf8Bytes) {  
         CharList charList = new CharList();  
         byte b2 = 0, b3 = 0;  
         int ub1 = 0, ub2 = 0;  
           
         for (int i = 0; i < utf8Bytes.length; i++) {  
             byte b = utf8Bytes[i];  
             if (isNotHead(b)) {  
                 // start with 10xxxxxx, skip it.  
                 continue;  
             } else if (b > 0) {  
                 // 1 byte, ASCII   b
                 charList.add((char) b);  
             } else if ((b & B_11110000) == B_11110000) {  
                 // UCS-4, here we skip it  
                 continue;  
             } else if ((b & B_11100000) == B_11100000) {  
                 // 3 bytes  
                 b2 = utf8Bytes[i+1];  
                 if (!isNotHead(b2)) continue;  
                 i++;  
                 b3 = utf8Bytes[i+1];  
                 if (!isNotHead(b3)) continue;  
                 i++;  
                 ub1 = ((b & B_00001111) << 4) + ((b2 & B_00111100) >> 2);  
                 ub2 = ((b2 & B_00000011) << 6) + ((b3 & B_00111111));  
                 charList.add(makeChar(ub1, ub2));  
             } else {  
                 // 2 bytes  
                 b2 = utf8Bytes[i+1];  
                 if (!isNotHead(b2)) continue;  
                 i++;  
                 ub1 = (b & B_00011100) >> 2;  
                 ub2 = ((b & B_00000011) << 6) + (b2 & B_00111111);  
                 charList.add(makeChar(ub1, ub2));  
             }  
         }  
           
         return charList.toArray();  
     }  
       
     private static boolean isNotHead(byte b) {  
         return (b & B_11000000) == B_10000000;  
     }  
       
     private static char makeChar(int b1, int b2) {  
         return (char) ((b1 << 8) + b2);  
     }  
       
     public static byte[] fromUCS2(char[] ucs2Array) {  
         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
         for (int i = 0; i < ucs2Array.length; i++) {  
             char ch = ucs2Array[i];  
             if (ch <= 0x007F) {  
                 baos.write(ch);  
             } else if (ch <= 0x07FF) {  
                 int ub1 = ch >> 8;  
                 int ub2 = ch & 0xFF;  
                 int b1 = B_11000000 + (ub1 << 2) +  (ub2 >> 6);  
                 int b2 = B_10000000 + (ub2 & B_00111111);  
                 baos.write(b1);  
                 baos.write(b2);  
             } else {  
                 int ub1 = ch >> 8;  
                 int ub2 = ch & 0xFF;  
                 int b1 = B_11100000 + (ub1 >> 4);  
                 int b2 = B_10000000 + ((ub1 & B_00001111) << 2) + (ub2 >> 6);  
                 int b3 = B_10000000 + (ub2 & B_00111111);  
                 baos.write(b1);  
                 baos.write(b2);  
                 baos.write(b3);  
             }  
         }  
         return baos.toByteArray();  
     }  
       
     private static class CharList {  
         private char[] data = null;  
         private int used = 0;  
         public void add(char c) {  
             if (data == null) {  
                 data = new char[16];  
             } else if (used >= data.length) {  
                 char[] temp = new char[data.length * 2];  
                 System.arraycopy(data, 0, temp, 0, used);  
                 data = temp;  
             }  
             data[used++] = c;  
         }  
         public char[] toArray() {  
             char[] chars = new char[used];  
             System.arraycopy(data, 0, chars, 0, used);  
             return chars;  
         }  
     }  
       
     private static void assert1(String s) throws UnsupportedEncodingException {  
         byte[] b = s.getBytes("utf-8");  
         char[] c = toUCS2(b);  
         if (!s.equals(new String(c))) {  
             throw new RuntimeException("Can not pass assert1 for: " + s);  
         }  
     }  
       
     private static void assert2(String s) throws UnsupportedEncodingException {  
         byte[] b = s.getBytes("utf-8");  
         byte[] b2 = fromUCS2(s.toCharArray());  
         if (b.length == b2.length) {  
             int i;  
             for (i = 0; i < b.length; i++) {  
                 if (b[i] != b2[i]) {  
                     break;  
                 }  
             }  
             if (i == b.length) {  
                 return;  
             }  
         }  
         throw new RuntimeException("Can not pass assert2 for: " + s);  
     }  
       
     public static void main(String[] args) throws Exception {  
         assert1("test");  
         assert1("中文测试");  
         assert1("A中V文c测d试E");  
         assert1("\u052CA\u052CBc测");  
           
         assert2("test");  
         assert2("中文测试");  
         assert2("A中V文c测d试E");  
         assert2("\u052CA\u052CBc测\u007F\u07FF");  
           
         System.out.println("pass");  
     }  
  
 } 

 

 

 

 

 

 

分享到:
评论

相关推荐

    全面了解mysql中utf8和utf8mb4的区别

    MySQL中的UTF8与UTF8MB4是两种不同的字符编码方式,它们主要的区别在于对Unicode字符集的支持程度。本文将深入探讨这两种编码的区别,以便更好地理解它们在实际应用中的选择。 一、UTF8与UTF8MB4简介 UTF8是...

    MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

    这里我们将深入探讨UTF8和UTF8MB4两种编码格式,以及它们各自的排序规则`utf8mb4_unicode_ci`和`utf8mb4_general_ci`。 首先,UTF-8是一种广泛使用的Unicode字符编码方案,它允许使用1到4个字节来表示不同的字符。...

    c++ UTF-8 UTF-16转换

    在编程领域,尤其是在涉及到字符编码的时候,理解和操作UTF-8和UTF-16之间的转换是一项基本技能。UTF-8和UTF-16是两种广泛使用的Unicode编码格式,它们各自有其特性和应用场景。本文将深入探讨如何利用C++来实现这两...

    utf8.zip_UTF8_VB6 UTF-8_cutf8.cls_utf8解码在线_vb6

    在VB6中,由于其内置的字符串操作函数不直接支持UTF-8,因此我们需要自定义函数或利用第三方类库来实现UTF-8的编码和解码。 "utf8.zip"这个压缩包包含了VB6中处理UTF-8所需的相关资源。其中,“cutf8.cls”很可能是...

    UTF8转16进制工具 Utf8ToHex

    标题中的"UTF8转16进制工具 Utf8ToHex"指的是一个能够将UTF-8编码的字符串转换成16进制表示形式的实用工具。描述中提到的例子,中文的“你好”在UTF-8编码下是"\xE4\xBD\xA0\xE5\xA5\xBD",这个就是将UTF-8编码转换...

    UTF8-无BOM转为UTF16LE

    例如,"phonebook_export_unicode_L.csv"可能是使用UTF16LE编码的电话簿数据,而"phonebook_export_utf8.csv"和"phonebook_export_utf8_noBOM.csv"则是使用UTF8编码的,后者没有BOM。 在实际应用中,例如在跨平台的...

    CString转UTF8,UTF8转CString

    ### CString与UTF-8之间的转换方法 在C++编程中,尤其是在使用Microsoft Foundation Classes (MFC)库进行Windows应用程序开发时,字符串处理是一项常见的任务。本文将详细介绍如何在MFC中实现`CString`对象与UTF-8...

    lua-utf8.zip

    a utf-8 support module for Lua and LuaJIT 源码地址:https://github.com/starwing/luautf8 编译后可用的库: Linux版:lua-utf8.so Windows版:lua-utf8.dll(若是用在openresty中,openresty版本需使用32位版本...

    批量utf文件转utf8-bom

    "批量utf文件转utf8-bom"这个主题指的是将一批以UTF编码的文件转换为带有BOM(Byte Order Mark)的UTF-8编码。BOM是一个特殊的字节序列,用于标识文件的编码类型,对于UTF-8编码,BOM的字节序列为0xEF, 0xBB, 0xBF。...

    UTF7 编码及解码工具

    UTF7编码是一种Unicode字符集的变种编码方式,全称为"UTF-7: Unicode Transformation Format – 7-bit"。在1992年由IBM的Doug Ewell提出,初衷是为了适应那些只能处理7位ASCII字符的通信协议,如电子邮件系统。UTF7...

    utf-8.rar_c++ string utf-8_string to utf-8_utf_utf 8_utf-8

    在C++编程中,UTF-8编码是一种广泛使用的字符编码标准,它能够表示Unicode字符集中的所有字符。本文将深入探讨如何在C++中处理UTF-8字符串,并介绍相关的关键概念和技术。 首先,C++标准库并没有直接支持UTF-8编码...

    UTF-8编码表

    UTF,是UnicodeTransformation Format的缩写,意为Unicode转换格式。UTF-8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。 如果UNICODE...

    易语言UTF8解码

    易语言UTF8解码是关于在易语言编程环境中处理UTF-8编码的一种技术。UTF-8是一种广泛使用的Unicode字符编码方案,它可以表示Unicode标准中的所有字符。易语言是中国开发的一款面向初学者和专业开发者的编程语言,其...

    Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

    用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别。。 ci是 case insensitive, 即 “大小写不敏感”, a 和 A 会在字符判断中会被当做一样的; bin 是二进制, a 和 A 会别区别对待. ...

    批量转UTF8工具-批量转UTF8工具

    UTF8编码是目前互联网上最广泛使用的字符编码标准,它能有效地表示世界上几乎所有的文字系统,包括汉字、拉丁字母、希腊字母等。批量转UTF8工具则是针对那些需要将大量文本文件从其他编码格式(如GBK、BIG5等)转换...

    C/C++语言UTF16和UTF32互相转换生成文件

    UTF-16和UTF-32是两种广泛使用的Unicode编码格式,它们分别以不同的方式表示 Unicode 字符集中的每一个字符。本篇文章将深入探讨如何使用C/C++进行UTF-16和UTF-32之间的转换,并讨论在读取和写入文件时的相关技术。 ...

    utf8转gbk-C语言版本.rar

    本主题聚焦于从UTF-8编码转换到GBK编码的C语言实现,这对于单片机开发尤其关键,因为单片机往往资源有限,且可能需要支持中文显示。 UTF-8是一种广泛使用的Unicode字符编码方案,它可以表示Unicode字符集中所有的...

    c语言gbk、utf8转换编码表及函数

    GBK和UTF-8是两种常见的字符编码格式,它们各有特点并应用于不同的场景。本篇将详细介绍GBK与UTF-8编码的区别,以及如何在C语言中进行这两种编码的转换。 1. **GBK编码** - GBK是中国大陆广泛使用的汉字编码标准,...

    UNICODE与UTF-8转换

    **标题:**UNICODE与UTF-8转换 **正文:** 在计算机科学中,字符编码是用于表示文本的一种方式,特别是在计算机系统中。UNICODE和UTF-8是两种广泛使用的字符编码标准,它们各自有着独特的特性和应用场景。本文将...

    UTF-8toGBK_labview编码gbk_LabVIEWUTF-8_utf-8toGbk_

    UTF-8和GBK是两种常见的字符编码格式,它们各有特点,适用于不同的场景。本篇文章将详细探讨UTF-8与GBK编码,以及如何在LabVIEW环境下进行这两种编码之间的转换。 首先,UTF-8(Unicode Transformation Format - 8 ...

Global site tag (gtag.js) - Google Analytics