1. 程式人生 > >utf8和ucs2互轉

utf8和ucs2互轉

 UFT8和UCS2互轉效API使用進行拆分字數如圖


/*
 *	函式:
 *		 utf8_to_ucs2(utf8轉ucs2)
 *  引數:
 *		utf8:utf8資料
 *		utf8_lenght:utf8資料長度
 *		ucs2:儲存ucs2資料空間
 *		ucs2_lenght:儲存ucs2資料空間長度
 *  返回值:
 *		返回轉換後的ucs2位元組長度
 *	 備註:
 *		ucs2等於NULL或utf8_lenght小於0都會作為統計不做賦值操作
 * ssdwujianhua 2018/04/26 
 */
unsigned int utf8_to_ucs2(const char * utf8, unsigned int utf8_lenght, char *ucs2, unsigned int ucs2_lenght)
{
	if ( utf8_lenght < 1 && utf8_lenght > ucs2_lenght)
	{
		return 0;
	}
	unsigned int utf8_pos = 0;	   //位元組偏移位置
	unsigned int ucs2_pos = 0;
	bool bcount = true; //是否統計
	if(ucs2 != NULL || ucs2_lenght < 0)
	{
		bcount = false;
	}
	while(true)
	{
		if((utf8[utf8_pos]&0x80)==0) //1位元組
		{
			if( !bcount )
			{
				ucs2[ucs2_pos]=0;  
				ucs2[ucs2_pos+1]=utf8[utf8_pos]&0x7f; 
			}
			utf8_pos+=1;
			ucs2_pos+=2;
		}
		else if((utf8[utf8_pos]&0xe0)==0xc0)//2位元組
		{
			if(!bcount)
			{
				ucs2[ucs2_pos]=(utf8[utf8_pos]&0x1f)>>2;  
				ucs2[ucs2_pos+1]=((utf8[utf8_pos]&0x03)<<6)|(utf8[utf8_pos+1]&0x3f);
			}
			utf8_pos+=2;
			ucs2_pos+=2;
		}
		else if((utf8[utf8_pos]&0xf0)==0xe0)//3位元組
		{
			if(!bcount)
			{
				ucs2[ucs2_pos]=((utf8[utf8_pos]&0x0f)<<4)|((utf8[utf8_pos+1]&0x3f)>>2);  
				ucs2[ucs2_pos+1]=((utf8[utf8_pos+1]&0x03)<<6)|(utf8[utf8_pos+2]&0x3f); 
			}
			utf8_pos+=3;
			ucs2_pos+=2;
		}
		else
		{
			return -1;
		}

		if ( utf8_pos >= utf8_lenght)
		{
			if(!bcount)
				ucs2[ucs2_pos]='\0';
			break;
		}
	}
	return ucs2_pos;
}

 /*
  *	函式:
  *		 ucs2_to_utf8
  *  引數:
  *		ucs2:ucs2資料
  *		ucs2_lenght:ucs2資料長度
  *		utf8:儲存utf8資料空間
  *		utf8_lenght:儲存utf8資料空間長度
  *  返回值:
  *		返回轉換後的utf8位元組長度
  *	 備註:
  *		uft8等於NULL或utf8_lenght小於0都會作為統計不做賦值操作
  * ssdwujianhua 2018/04/26 
  */
unsigned int ucs2_to_utf8(const char *ucs2, unsigned int ucs2_lenght, char * utf8, unsigned int utf8_lenght)
{
	if ( utf8_lenght < 1 && (utf8_lenght > ucs2_lenght))
	{
		return 0;
	}
	unsigned int utf8_pos = 0;	   //位元組偏移位置
	unsigned int ucs2_pos = 0;
	bool bcount = true; //是否統計
	if(utf8 != NULL || utf8_lenght < 0)
	{
		bcount = false;
	}
	while(true)
	{
		if (ucs2[ucs2_pos] == 0x00 && ucs2[ucs2_pos+1] <= 0x7f) //2個位元組轉成一個位元組
		{
			if(!bcount)
			{
				utf8[utf8_pos]=ucs2[ucs2_pos+1]&0x7f;
			}
			ucs2_pos+=2;
			utf8_pos+=1;
		}
		else if ((ucs2[ucs2_pos]&0xf8)==0)//兩個位元組處理
		{
			if(!bcount)
			{
				utf8[utf8_pos]=0xc0|((ucs2[ucs2_pos]&0x07)<<2)|((ucs2[ucs2_pos+1]&0xc0)>>6);   
				utf8[utf8_pos+1]=0x80|ucs2[ucs2_pos+1]&0x3f;
			}
			ucs2_pos+=2;
			utf8_pos+=2;
		}
		else//三個位元組處理
		{
			if(!bcount)
			{
				utf8[utf8_pos]=0xe0|((ucs2[ucs2_pos]&0xf0)>>4);  
				utf8[utf8_pos+1]=0x80|((ucs2[ucs2_pos]&0x0f)<<2)|((ucs2[ucs2_pos+1]&0xc0)>>6);
				utf8[utf8_pos+2]=0x80|ucs2[ucs2_pos+1]&0x3f;
			}
			ucs2_pos+=2;
			utf8_pos+=3;
		}

		if (ucs2_pos >= ucs2_lenght )
		{
			if(!bcount)
				utf8[utf8_pos] = '\0';
			break;
		}
	}
	return utf8_pos;
}

相關推薦

utf8ucs2

 UFT8和UCS2互轉效API使用進行拆分字數如圖 /* * 函式: * utf8_to_ucs2(utf8轉ucs2) * 引數: * utf8:utf8資料 * utf8_lenght:utf8資料長度 * ucs2:儲存ucs2資料空間

C++ UTF8UTF16代碼

define iter 般的 != ont for efault 互轉 小端 簡介 1、這段代碼只考慮在小端序情況下的轉換(一般的機器都是的)。2、這段代碼需要C++11的支持(只是用到了u16string),如果不支持,可以添加下面代碼 typedef uin

wchar_t* char*

multi pan com nic return compose ide acp 轉化 //將單字節char*轉化為寬字節wchar_t* wchar_t* AnsiToUnicode(const char* szStr){ int nLen = MultiByte

utf8 unicode 編碼

true 編碼 turn cti ram brush amp switch bsp static function utf8_to_unicode($c) { switch(strlen($c)) { case 1:

Python list str

pytho str 輸出 互轉 div python post 字符串 pri 一、list轉字符串 命令:‘‘.join(list)其中,引號中是字符之間的分割符,如“,”,“;”,“\t”等等如:list = [1, 2, 3, 4, 5]‘‘.join(list)

DOM對象jQuery

scrip jquery 兩種 通過 需要 tel dom ron blog 一、jQuery對象轉成DOM對象: 兩種轉換方式將一個jQuery對象轉換成DOM對象:[index]和.get(index); (1)jQuery對象是一個數據對象,可以通過[index]的方

數組list

.cn ring 數組 code size length slist color pre 數組轉list 方法1: String[] stringArray = { "a", "b", "c", "d", "e" }; List<String> list =

數組List

arrays 集合public class TestArrayList { public static void main(String[] args) { List<String> list = new ArrayList<String>() ; list.add("AAA"

CStringchar

erl HA str CP lpc In car har name CString轉char: CString m_Readcard; char ReaderName[22]; strcpy((char*)&ReaderName,(LPCTSTR)m_Readcar

C# 位元組陣列字串

本章講述:部分資料型別,格式轉換(十六進位制字串和位元組陣列 互轉    位元組陣列和字串 互轉)  public class HexConverter { #region 格式轉換 /// <summary> /// 轉換十六進位制

mapjson

/** * 轉換MP自己定義的JSONArray物件為List<Map>物件 * @param obj * @return */ public static List<Map<String,String>> jsonArrToList(JSO

iOS 音訊錄製AMRWAV(支援64位)

公司專案中涉及到語音錄製的功能,在錄音格式方面遇到一些小問題現在拿出來與大家分享一下。 眾所周知,iOS 音訊錄製是不支援AMR格式的。但 Android 好像是預設是AMR格式的。兩邊格式不同必然有一方做出妥協的。這裡只簡單介紹一下iOS 格式轉碼的方法。 1、音訊錄製簡介 在AVFoun

自定義物件json

       有一次寫side project時,用json.dumps()方法對UserInfo物件進行序列化,卻報錯了。Object type of UserInfo is not JSON serializable.經過一番探索發現,json.dum

Mybatis BlobString,實現檔案上傳等。

這樣的程式碼網上有很多,但是本人親測有bug, 下面是我寫的程式碼。望參考 1 @MappedJdbcTypes(JdbcType.BLOB) 2 public class BlobAndStringTypeHandler extends BaseTypeHandler<String&g

利用JAXB對java物件xml

好一段時間沒寫部落格了,一直出差得有半年多時間了吧!其實還是懶,哈哈 最近算是轉行做大資料了,還好有個前輩帶帶,應該是比不少人少走彎路吧! 這東西主要學的是思想 今天寫個java物件和xml互轉的(專案的要用到xml的配置檔案) 主要是用JAXB實現java

Unicode編碼中文(JAVA實現)

//中文轉Unicode public static String gbEncoding(final String gbString) { //gbString = "測試" char[] utfBytes = gbString.toCharArray();

Objectxml

import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentEx

java:集合框架(Arrays工具類的asList()方法的使用)-陣列集合

import java.util.ArrayList; import java.util.Arrays; import java.util.List; //陣列轉集合,雖然不能增加或刪除元素,但是可以集

Java JsonMap

1.Json轉Map /** * @Author:wangh * @Description:json串解析存至map * @Date: */ public static Map<String, Object> Js

Java pdfjpg

pdfbox: jpg轉pdf: /** * 使用pdfbox將jpg轉成pdf * @param jpgStream jpg輸入流 * @param pdfPath pdf檔案儲存路徑 * @throws IOException IOExce