jjzjj

c++ - 什么是跨平台字符串类的 "Best Practices"以实现良好的模型可移植性?

coder 2024-02-21 原文

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center为指导。




8 年前关闭。




关于跨平台 Unicode 字符串使用的主题有无数的讨论线程,但似乎存在广泛的意见,但没有解决在我正在从事的特定项目中一直困扰我的一些具体问题:

我有一个大型跨平台 C++ 代码库,可以追溯到近 20 年前。它包含各种字符串实现的大杂烩,包括:

  • char*
  • 帕斯卡式字符串
  • std::string
  • 几个具有重叠功能的自定义跨平台类
  • CFString
  • 各种常量字符串

  • 该代码库正在被重写以完全使用 Unicode 字符串并实现强大的 MVC 架构,希望该模型将是完全可移植的(Mac OS/IOS/Android/Windows 7 & 8/Unix)。

    虽然持久数据被编写为 XML/UTF-8,但在运行时对象中的字符串使用方面存在一些困境:
  • 我想创建一个类,它完全隐藏了存储、分配和常见字符串操作的实现。通过 C++ 运算符和赋值重载的奇迹,我希望能够替换一个类实例来替换函数可以接受的所有不同的字符串参数。这将允许代码库的增量转换。
  • 我们一直在扫描/解析/分析字符串,我担心对持久对象使用严格的 UTF-8 底层实现可能会出现性能问题。如果不是,在微软的 VC++ 和 GNU 的 G++ 中找到的现代 std::string 是否是一个简单的底层实现?
  • Mac OS/IOS 版本最终需要将它们的字符串“转换”为 CFString。 CF 功能丰富且高度优化。我认为通过为 CF 提供缓冲区(例如, CFStringCreateWithCharactersNoCopyCFStringCreateMutableWithExternalCharactersNoCopy )让我自己的类创建 CFStrings 将是一个很好的策略。似乎这可以减少 CFString 在从模型中获取数据后通常需要的转换/分配量——尽管也许在适当的 MVC 实现中, Controller / View 不应该访问模型拥有的实际字符串?
  • C++ 11 是否会更改任何这些跨平台字符串问题的图片?

  • 我猜这些问题早就应该解决了——但是从查看这个网站(和其他网站)上的回复我看不出它已经解决了。

    最佳答案

    I'd like to create a class that cleanly hides the implementation of storage, allocation and common string operations. Through the miracle of C++ operator and assignment overloading I'm hoping to be able to substitute a class instance to replace all the different string parameters that functions can accept. This would allow for an incremental conversion of the code base.



    听起来像 std::stringconst char* 添加强制转换运算符,因此您无需调用 c_str() .这意味着您必须使用 char和 UTF-8 用于存储,而不是 UTF-16 或类似的。

    We are constantly scanning / parsing / analyzing strings, and I worry that using a strictly UTF-8 underlying implementation for persistent objects might have performance issues. If not, would the modern std::string found in Microsoft's VC++ and GNU's G++ be a simple underlying implementation?



    这取决于其他几个因素。一方面,如果您的输入包含大量非 ascii 数据并且您必须一次分析一个代码点,则 UTF-8 可能效率低下。在这种情况下,UTF-16 甚至 UTF-32 可能更合理,因为从多个字符串元素重新组合代码点时不会有太多的大小写差异。另一方面,性能在很大程度上取决于您是否可以通过引用传递字符串或必须创建拷贝,尤其是在调用函数时。因此,可能需要对现有代码库进行一些修改,以避免复制过多。

    The Mac OS / IOS versions ultimately need to have their strings "converted" to CFString. The CF functions are rich and highly optimized. I'm thinking it would be a good strategy to have my own class create CFStrings by providing CF with a buffer (for example, CFStringCreateWithCharactersNoCopy or CFStringCreateMutableWithExternalCharactersNoCopy). Seems as if this could reduce the amount of conversion/allocation CFString would normally require after fetching data from the model — ALTHOUGH perhaps in a proper MVC implementation the Controller/View shouldn't have access to actual strings owned by the model?



    当您在不复制数据缓冲区的情况下创建字符串时,您必须确保只要访问该字符串,缓冲区就一直存在。这在某些情况下可能是正确的,但并非在所有情况下都是如此。一般来说,这些问题与您在 char* 中遇到的问题非常相似。由 std::string 支持,这就是为什么c_str()的原因是一个显式的函数调用,而不仅仅是一个自动转换。通过进行这样的转换,您必须保证原始对象保持分配状态。一般来说,我会通过 const std::string& View ,因此它们不会意外更改模型拥有的字符串。如果他们需要保留或修改字符串,则必须复制它。

    Does C++ 11 change the picture for any of these cross-platform string issues?



    C++ 11 提供了许多新的智能指针实现,允许您更好地控制字符串对象保持分配的时间。例如,您可以使用 shared_prt<string>作为你的类的数据存储,获得自动引用计数和字符串释放。这将为您提供更高级别的抽象,但可能与您当前代码库的功能相距甚远,因此我不确定这是否会让您更轻松地进行移植。

    关于c++ - 什么是跨平台字符串类的 "Best Practices"以实现良好的模型可移植性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14189864/

    有关c++ - 什么是跨平台字符串类的 "Best Practices"以实现良好的模型可移植性?的更多相关文章

    1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    2. Ruby 解析字符串 - 2

      我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

      我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

    5. ruby-on-rails - unicode 字符串的长度 - 2

      在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

    6. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

      我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

    7. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

      我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

    8. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    9. ruby - 将差异补丁应用于字符串/文件 - 2

      对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

    10. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

      大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

    随机推荐