热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UTF-8与Unicode编码互转方法详解

本文介绍了两种实现UTF-8与Unicode编码之间相互转换的方法:一种是不使用VisualC++库函数的手动转换方法,另一种则是利用VisualC++提供的库函数进行高效转换。

1. 手动实现UTF-8与Unicode编码转换:

class StringConverter { public: static int UnicodeToUtf8(char* output, int& outputSize, const wchar_t* input, int inputSize); static int Utf8ToUnicode(wchar_t* output, int outputSize, const char* input, int inputSize); }; /** * 将Unicode字符串转换为UTF-8编码 * @param output 输出缓冲区指针 * @param outputSize 输出缓冲区大小 * @param input 输入Unicode字符串指针 * @param inputSize 输入字符串长度 * @return 成功时返回转换后的字符串长度,失败返回-1 */ int StringConverter::UnicodeToUtf8(char* output, int& outputSize, const wchar_t* input, int inputSize) { if (output == nullptr || input == nullptr || inputSize <0) return -1; int requiredSize = 0; for (int i = 0; i (ch); } else if (ch <= 0x7FF) { *current++ = 0xC0 | (ch >> 6); *current++ = 0x80 | (ch & 0x3F); } else if (ch <= 0xFFFF) { *current++ = 0xE0 | (ch >> 12); *current++ = 0x80 | ((ch >> 6) & 0x3F); *current++ = 0x80 | (ch & 0x3F); } } return current - output; } /** * 将UTF-8编码字符串转换为Unicode * @param output 输出缓冲区指针 * @param outputSize 输出缓冲区大小 * @param input 输入UTF-8字符串指针 * @param inputSize 输入字符串长度 * @return 成功时返回转换后的字符串长度,失败返回-1 */ int StringConverter::Utf8ToUnicode(wchar_t* output, int outputSize, const char* input, int inputSize) { if (output == nullptr || input == nullptr || inputSize <0) return -1; int requiredSize = 0; for (int i = 0; i (input[i]); if (byte <= 0x7F) requiredSize += 1; else if ((byte & 0xE0) == 0xC0) requiredSize += 1; else if ((byte & 0xF0) == 0xE0) requiredSize += 1; } if (outputSize (input[i]); if (byte <= 0x7F) { *current++ = byte; } else if ((byte & 0xE0) == 0xC0) { *current++ = (input[i] & 0x1F) <<6 | (input[++i] & 0x3F); } else if ((byte & 0xF0) == 0xE0) { *current++ = (input[i] & 0x0F) <<12 | (input[++i] & 0x3F) <<6 | (input[++i] & 0x3F); } } return current - output; }

2. 利用Visual C++库函数进行转换:

char* UnicodeToUtf8(const wchar_t* unicode) { int len = WideCharToMultiByte(CP_UTF8, 0, unicode, -1, nullptr, 0, nullptr, nullptr); char* str = new char[len + 1]; memset(str, 0, len + 1); WideCharToMultiByte(CP_UTF8, 0, unicode, -1, str, len, nullptr, nullptr); str[len] = '\0'; return str; } wchar_t* Utf8ToUnicode(const char* utf8) { int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, nullptr, 0); wchar_t* wstr = new wchar_t[len + 1]; memset(wstr, 0, len + 1); MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len); wstr[len] = '\0'; return wstr; }


推荐阅读
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
author-avatar
Breerus
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有