UTF8 编码解析/解码(附加代码) .

本文转载自  http://blog.youkuaiyun.com/caoxinst/article/details/7833814  希望他允许我转载他的文章

 最近在用cocos2d -x 做一个带滑动条的TextField(完成之后会公布出来)!!顺便了解了一下UTF8的编码格式!!

  UTF8编码格式!一定要了解!

  它其实和Unicode是同类,就是在编码方式上不同!
   首先UTF8编码后的大小是不一定,不像Unicode编码后的大小是一样的!
  我们先来看Unicode的编码:一个英文字母和 一个汉字 在编码后都是占用的空间大小是一样的,都是两个字节!而UTF8编码:一个英文字母 和 一个汉字,编码后占用的空间大小就不样了,前者是一个字节,后者是三个字节!
    因为一个字母还有一些键盘上的符号加起来只用二进制七位就可以表示出来,而一个字节就是八位,所以UTF8就用一个字节来表式字母和一些键盘上的符号。然而当我们拿到被编码后的一个字节后怎么知道它的组成?它有可能是英文字母的一个字节,也有可能是汉字的三个字节中的一个字节!所以,UTF8是有标志位 的!
    当要表示的内容是 7位 的时候就用一个字节:0*******  第一个0为标志位,剩下的空间正好可以表示ASCII 0-127 的内容。当要表示的内容在 8 到 11 位的时候就用两个字节:110***** 10******  第一个字节的110和第二个字节的10为标志位。当要表示的内容在 12 到 16 位的时候就用三个字节:1110***** 10****** 10******  和上面一样,第一个字节的1110和第二、三个字节的10都是标志位,剩下的空间正好可以表示汉字。

以此类推:

  四个字节:11110**** 10****** 10****** 10******
  五个字节:111110*** 10****** 10****** 10****** 10******
  六个字节:1111110** 10****** 10****** 10****** 10****** 10******
  ............................................
  ..............................................
  明白了没有?
  编码的方法是从低位到高位
   现在就让我们来看看实例吧!

    黄色为标志位
    其它着色为了显示其,编码后的位置

Unicode十六进制

Unicode二进制

UTF8二进制

UTF8十六进制

UTF8字节数

B

00001011

00001010

B

1

9D

00010011101

11000010 10011101

C2 9D

2

A89E

10101000 10011110

11101010 10100010 10011110

EA A2 9E

3

UTF8 字符串解析!!代码如下:

void parseUTF8(string sin,std::list<string> &msgList)
{
   int l = sin.length();
    for(int p = 0; p < l; ) {
      int size,;
      unsigned char c = sin[p];
      if(c < 0x80) {
         size = 1;//占一个字节
      } else if(c < 0xc2) {
      } else if(c < 0xe0) {
         size = 2;//占2个字节
      } else if(c < 0xf0) {
         size = 3;
      } else if(c < 0xf8) {
         size = 4;
      } else if (c < 0xfc) {
         size = 5;
      } else if (c < 0xfe) {
         size = 6;
      }  
       string temp = "";
        temp = sin.substr(p, size);
        msgList.push_back(temp);
        p += size;}
}

安装“Eclipse for JAVA”, 用Eclipse,选择 File > New > Maven Project,勾选 Create a simple project,设置 GroupId (com.ai_api.example)和 ArtifactId(自定),在 src/main/java 下创建(com.ai_api.example)包 ,在“https://bailian.console.aliyun.com/?tab=model#/api-key”上申请“API_KEY”,再利用“https://bailian.console.aliyun.com/detail/”、“ https://yuanbao.tencent.com/chat/”或“https://www.deepseek.com”以及百度将以下代码调通并加上注释: //构建 JSON 请求体 jsonRequest = String.format("{ \"model\": \"%s\", \"messages\": [{\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},{\"role\": \"user\",\"content\": [{\"type\": \"text\",\"text\": \"这是什么,并请详细描述!\"},{\"type\": \"image_url\",\"image_url\": {\"url\": \"https://pan.hunnu.edu.cn/f/751ebbd651e242679682/?dl=1\"}}]}] }"," qwen-vl-plus"); // \"model\": \"%s\"还可以是qwen-plus 或者 deepseek-r1等模型 //创建 HTTP 客户端和 POST 请求 try (CloseableHttpClient client = HttpClients.createDefault()) { HttpPost httpPost = new HttpPost(API_URL); httpPost.setHeader("Content-Type", "application/json"); httpPost.setHeader("Authorization", "Bearer " + API_KEY); httpPost.setEntity(new StringEntity(jsonRequest, "UTF-8")); //发送请求并处理响应 try (CloseableHttpResponse response = client.execute(httpPost)) { HttpEntity entity = response.getEntity(); String responseBody = EntityUtils.toString(entity, "UTF-8"); //解析 JSON 响应 ObjectMapper mapper = new ObjectMapper(); JsonNode rootNode = mapper.readTree(responseBody); System.out.println("DeepSeek 解析结果:\n" + rootNode.toPrettyString()); System.out.println("DeepSeek 解析结果:\n" + rootNode.findValuesAsText("content").toString()); } } } catch (Exception e) { e.printStackTrace(); } } 修改上述代码,通过切换模型名称和类型(type)等,实现对文字、文本文件、视频链接的分析或翻译。 调通了的同学请将你的工程文件发到群里或发给我。
05-16
import json import urllib.parse import urllib.request # 读取 line.json 文件中的数据 with open('line.json', 'r', encoding='utf-8') as file: data = json.load(file) # 将数据转换为 URL 编码形式 encoded_params = urllib.parse.urlencode({ 'dataType': 'Query', 'strParams': json.dumps(data, ensure_ascii=False) }, quote_via=urllib.parse.quote) # 拼接基础 URL 和编码后的参数 base_url = 'https://swf.cq.pegatroncorp.com/Pages/api/ClassRateKB.ashx' full_url = f'{base_url}?{encoded_params}' print(full_url) # 发送 HTTP 请求并获取响应 response = urllib.request.urlopen(full_url) response_data = json.loads(response.read().decode('utf-8')) # 将响应结果保存为 JSON 文件 with open('response_result.json', 'w', encoding='utf-8') as output_file: json.dump(response_data, output_file, ensure_ascii=False, indent=4) 以上代碼報錯PS C:\Users\Duanfei_He\Desktop\人工數位直通率派工> & C:\Users\Duanfei_He\AppData\Local\Programs\Python\Python310\python.exe c:/Users/Duanfei_He/Desktop/人工數位直通率派工/Teams_Main.py https://swf.cq.pegatroncorp.com/Pages/api/ClassRateKB.ashx?dataType=Query&strParams=%7B%22ShopID%22%3A%20%22B01%22%2C%20%22Line%22%3A%20%5B%22B01_BN10%22%2C%20%22B01_BN11%22%2C%20%22B01_BN12%22%2C%20%22B01_BN13%22%2C%20%22B01_BN14%22%2C%20%22B01_BN15%22%5D%7D Traceback (most recent call last): File "c:\Users\Duanfei_He\Desktop\人工數位直通率派工\Teams_Main.py", line 21, in <module> response = urllib.request.urlopen(full_url) File "C:\Users\Duanfei_He\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 216, in urlopen return opener.open(url, data, timeout) File "C:\Users\Duanfei_He\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 525, in open response = meth(req, response) File "C:\Users\Duanfei_He\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 634, in http_response response = self.parent.error( File "C:\Users\Duanfei_He\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 563, in error return self._call_chain(*args) File "C:\Users\Duanfei_He\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 496, in _call_chain result = func(*args) File "C:\Users\Duanfei_He\AppData\Local\Programs\Python\Python310\lib\urllib\request.py", line 643, in http_error_default raise HTTPError(req.full_url, code, msg, hdrs, fp) urllib.error.HTTPError: HTTP Error 401: Unauthorized請提供修改后的完整代碼
最新发布
08-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值