博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用 Clozure CL 在 Cocoa 窗口组件中实现显示中文字符串的简单方法
阅读量:7227 次
发布时间:2019-06-29

本文共 2983 字,大约阅读时间需要 9 分钟。

hot3.png

使用 Clozure CL 在 Cocoa 窗口组件中实现显示中文字符串的简单方法

目录

0 概述

我们知道, 在 Cocoa 中提供了两种字符串类: NSString 和 NSMutableString, 前者用于处理内容不变, 固定的字符串, 比如窗口标题; 后者用于处理内容可变的字符串, 当然后者也可以用于前者的使用场合.

因为后者 NSMutableString 类是在继承 NSString 类的继承上创建的, 所以 NSMutableString 具有NSString 中所有的功能.

1 Objective-C 和 Lisp 的不同方法

在 Objective-C 代码中通常会使用如下的格式来定义字符串:

NSString string = @"This is my string";

语法非常简单明了, 但是有一个问题:使用加 @ 符号的方式只能定义英文数字字符串, 如果想定义中文等多字节字符串, 这种方法是不支持的.

下面给出一种 Objective-C 中定义中文字符串的示例:

NSString* string;string = [NSString stringWithCString:"你好,我是中文字符串!"		encoding:NSUTF8StringEncoding];

是不是觉得这段代码特别繁琐, 如果转化为 Common Lisp 代码, 也比较麻烦, 不过 Clozure CL 已经提供了一种非常简单的生成中文字符串的方法, 如下:

(ccl::%make-nsstring "这是使用中文字符串的简单方法")

2 英文标题代码示例

举个实际的例子, 先绘制一个小窗口, 窗口标题为英文:

(in-package "CL-USER")(require "COCOA")(defclass window-view (ns:ns-view)  ()  (:metaclass ns:+ns-object))(objc:defmethod (#/drawRect: :void) ((self window-view) (rect :
ect)) (#/set (#/blueColor ns:ns-color)) (#_NSRectFill (#/bounds self)))(defun show-window () (ccl::with-autorelease-pool (let* ((rect (ns:make-ns-rect 0 0 350 350)) (w (make-instance 'ns:ns-window :with-content-rect rect :style-mask (logior #$NSTitledWindowMask #$NSClosableWindowMask #$NSMiniaturizableWindowMask) :backing #$NSBackingStoreBuffered :defer t))) (#/setTitle: w #@"This is a English Title!") (#/setContentView: w (#/autorelease (make-instance 'window-view))) (#/center w) (#/orderFront: w nil) (#/contentView w)))) (show-window)

截图如下:

英文标题窗口

接着我们修改一下这句:

(#/setTitle: w #@"This is a English Title!")

把它改为:

(#/setTitle: w (ccl::%make-nsstring "这是使用中文字符串的简单方法"))

当然了, 我们可以直接运行上述两段生成英文字符串和中文字符串的代码, 比较一下它们返回的结果,如下:

? #@"This is a English Title!"#
? (ccl::%make-nsstring "这是使用中文字符串的简单方法")#
?

很显然, 它们返回的对象类型不同, 一个是 NS-CONSTANT-STRING , 一个是 NS-MUTABLE-STRING.

全部代码形如:

(in-package "CL-USER")(require "COCOA")(defclass window-view (ns:ns-view)  ()  (:metaclass ns:+ns-object))(objc:defmethod (#/drawRect: :void) ((self window-view) (rect :
ect)) (#/set (#/blueColor ns:ns-color)) (#_NSRectFill (#/bounds self)))(defun show-window () (ccl::with-autorelease-pool (let* ((rect (ns:make-ns-rect 0 0 350 350)) (w (make-instance 'ns:ns-window :with-content-rect rect :style-mask (logior #$NSTitledWindowMask #$NSClosableWindowMask #$NSMiniaturizableWindowMask) :backing #$NSBackingStoreBuffered :defer t))) (#/setTitle: w (ccl::%make-nsstring "这是使用中文字符串的简单方法")) (#/setContentView: w (#/autorelease (make-instance 'window-view))) (#/center w) (#/orderFront: w nil) (#/contentView w)))) (show-window)

然后再次运行, 截图如下:

中文标题窗口

是不是很简单. :)

以上的示例代码可以作为一个简单的用 Lisp 写苹果 APP 程序的窗口模板, 你可以慢慢自己添加一些其他的功能, 很快就能得到一个不太大但是能够提供一些简单功能的 APP 程序了!

转载于:https://my.oschina.net/freeblues/blog/150002

你可能感兴趣的文章
基于房源的画像分析
查看>>
80% UI 初学者走过的弯路,你走了几条?
查看>>
文档和元素的几何滚动
查看>>
php 设计模式
查看>>
Java springcloud B2B2C o2o多用户商城 springcloud架构(八)springboot整合mongodb
查看>>
3年工作经验的Java程序员面试经过
查看>>
Mysql 批量写入数据,对于这类性能问题,你是如何优化的
查看>>
MySQL无法启动几种常见问题小结
查看>>
阿里CTO:阿里所有技术和产品输出都将必须通过阿里云进行
查看>>
更好用的集群限流功能,Sentinel 发布 v1.4.2
查看>>
Python(生成执行文件)
查看>>
redis安装配置 - ttlsa教程系列之redis
查看>>
Linux --DHCP服务器配置;DHCP服务器中继
查看>>
IE版本多的可爱_已迁移
查看>>
eclipse查看jar包中class的中文注释乱码问题的解决
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
mariadb安装
查看>>
vue+vuex+axios+echarts画一个动态更新的中国地图
查看>>
5.8 volumetric post-processing--game programming gems5 笔记
查看>>