getUTF8StringFromGBKString

本文提供了一个Java编码转换的具体实例,展示了如何将GBK编码的字符串转换为UTF-8编码,并通过手动构造UTF-8字节来实现这一过程。此方法有助于理解不同字符集之间的转换原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.iteye.com/problems/94345

 

package test;

import java.io.UnsupportedEncodingException;

public class TestEncoder {

 /**
  * @param args
  */
 public static void main(String[] args) throws Exception {
  String gbk = "iteye问答频道编码转换问题";
  
  String iso = new String(gbk.getBytes("UTF-8"),"ISO-8859-1");

  System.out.println(iso);
  
  String utf8 = new String(iso.getBytes("ISO-8859-1"),"UTF-8");
  System.out.println(utf8);
  
  System.out.println(getUTF8StringFromGBKString(gbk));
 }

 public static String getUTF8StringFromGBKString(String gbkStr) {
  try {
   return new String(getUTF8BytesFromGBKString(gbkStr), "UTF-8");
  } catch (UnsupportedEncodingException e) {
   throw new InternalError();
  }
 }
 
 public static byte[] getUTF8BytesFromGBKString(String gbkStr) {
  int n = gbkStr.length();
  byte[] utfBytes = new byte[3 * n];
  int k = 0;
  for (int i = 0; i < n; i++) {
   int m = gbkStr.charAt(i);
   if (m < 128 && m >= 0) {
    utfBytes[k++] = (byte) m;
    continue;
   }
   utfBytes[k++] = (byte) (0xe0 | (m >> 12));
   utfBytes[k++] = (byte) (0x80 | ((m >> 6) & 0x3f));
   utfBytes[k++] = (byte) (0x80 | (m & 0x3f));
  }
  if (k < utfBytes.length) {
   byte[] tmp = new byte[k];
   System.arraycopy(utfBytes, 0, tmp, 0, k);
   return tmp;
  }
  return utfBytes;
 }
}

 

 

### 使用 U8g2 库创建多级菜单 为了使用 U8g2 库在 OLED 显示屏上实现多级菜单功能,需要理解几个核心概念以及掌握一些基本操作方法。 #### 1. 初始化显示屏并设置基础参数 首先,在 Arduino IDE 中安装好 U8g2 库之后,初始化连接到 ESP32 的 OLED 屏幕,并配置其通信方式(I2C 或 SPI)。这一步骤确保屏幕正常工作并且准备好接收后续绘制命令[^2]。 ```cpp #include <U8g2lib.h> // 定义 I2C 地址和其他必要参数 const uint8_t i2cAddress = 0x3C; U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); ``` #### 2. 创建页面结构体表示各级菜单项 定义一个数据结构来保存每一页的内容及其子页链接。这里可以通过数组或者链表的形式构建树状层次关系,方便管理和遍历各个节点。 ```cpp struct MenuItem { const char* text; // 菜单项名称 int submenuIndex; // 子菜单索引 (-1 表示无子菜单) }; MenuItem menuItems[] = {{"Main Menu", -1}, {"Option A", 1}, {"Submenu of Option A", -1}}; int currentPage = 0; ``` #### 3. 编写绘图逻辑处理用户输入事件 编写循环程序监听按键状态变化或其他形式的人机交互信号源;当检测到有效触发时,则依据当前所在位置调整 `currentPage` 变量指向新的目标页面,并调用相应函数刷新界面显示内容。 ```cpp void drawMenu() { u8g2.clearBuffer(); // 绘制标题栏 u8g2.setFont(u8g2_font_ncenB08_tr); u8g2.drawStr(0, 10, "ESP32 OLED Menu"); // 获取当前选中的菜单项 String selectedText = String(menuItems[currentPage].text); // 计算居中文本的位置 int width = u8g2.getUTF8Width(selectedText.c_str()); int posX = (u8g2.getDisplayWidth() - width) / 2; // 绘制高亮选项 u8g2.setDrawColor(1); u8g2.drawBox(posX - 5, 20, width + 10, 20); u8g2.setDrawColor(0); u8g2.drawStr(posX, 35, selectedText.c_str()); u8g2.sendBuffer(); } void loop() { // 假设有一个名为 'buttonPressed' 的布尔变量用于判断是否有按钮被按下 if (buttonPressed && menuItems[currentPage].submenuIndex != -1){ currentPage = menuItems[currentPage].submenuIndex; drawMenu(); } } ``` 通过上述代码片段展示了如何利用 U8g2 库配合简单的控制流程设计一个多层导航式的图形化用户接口。当然实际开发过程中还需要考虑更多细节比如返回上级目录的功能、防止越界访问等问题,但这已经构成了一个完整的框架供进一步扩展和完善.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值