首页 文章 精选 留言 我的

精选列表

搜索[小微模型],共10000篇文章
优秀的个人博客,低调大师

GNOME 3.35.1 发布,小版本更新

GNOME 3.35.1已经发布了,内容有: GNOME Shell和Mutter的错误修复 File-Roller支持 Zstd 压缩文件/archive。File-Roller 现在也可以直接打开 .tar.lzo archive Epiphany 网页浏览器已重新启用按需加速合成 GJS现获得Meson 构建系统支持 NetworkManager applet 现在允许自组织网络支持 WPA 2 身份验证,还支持 WPA 3个人身份验证和其他改进 11 月底将迎来 GNOME 3.35.2。GNOME 3.36 在明年 2 月中旬达到测试阶段,随后是发布候选版本,而 GNOME 3.36.0稳定版本预计将在 3 月 11 日发布。发布说明: https://mail.gnome.org/archives/devel-announce-list/2019-October/msg00003.html

优秀的个人博客,低调大师

Firefox 69.0.3 发布,小版本修复

Firefox 69.0.3已经发布了,解决了受影响用户的下载问题,也解决了另一个问题,使用浏览器访问雅虎邮件的用户在查看电子邮件时出现了下载提示。具体是: 修复了启用 ParentalControl 的 Windows 10 用户的下载错误 #1586228 修复了雅虎邮件用户点击电子邮件时被提示下载文件的问题 #1582848 发布说明: https://www.mozilla.org/en-US/firefox/69.0.3/releasenotes/

优秀的个人博客,低调大师

GNOME 3.34.1 发布,小版本修复

GNOME 3.34.1 是上个月 GNOME 3.34 桌面版的第一个发布版,GNOME 3.34.1 的一些亮点包括: 对 Epiphany Web 浏览器的一些修复以及对小型设备的改进 用于使用 GDM 进行快速用户切换的修补程序 GNOME 控制中心和其他组件的崩溃修复 GNOME 软件有一个用于安装 web应用程序的修复程序、修复的第三方存储库启用和其他修复程序 Nautilus 文件管理器的主要问题修复 完整的更改列表见发布说明: https://mail.gnome.org/archives/devel-announce-list/2019-October/msg00001.html

优秀的个人博客,低调大师

阿里云入门搭建小细节

前言实习生涯还在继续,这两天倒腾了一下阿里云。下面来分享一下。 云服务器我觉得就是一台电脑,只不过你可以用,但是不能摸到,拿来挂QQ,挂个人网站,等等都行。 所以接下来开始入云端吧。 一、云服务器ECS购买 首先是买服务器,由于我还是学生,所以可以在阿里云便宜的买到一个服务器(配置比较低)。 名词解释:预装环境: 就是你买的服务器给你装什么系统(谨慎选择貌似后期无法更换), 图中,CentOS,Ubuntu 都是Linux系统,下面两个都是windows专门的服务器系统。 没玩过Linux的可以选下面两个试试水。 地域: 顾名思义吧,就是你的机子实际所在的地方。主要考虑的是,服务器目标用户所在地和 服务器直接的通信问题。一般来说越近越好。地域对应关系见下图↓↓↓ 还有就是服务器性能问题,上图的配置其实也够个人用的了,还有上图的网络速度其实 指的是服务器的上行速度,也就是外网的下行速度,实际服务器的下行速度还是很快的。 我选的是,Windows的服务器。 二、上云买好服务器以后就可以进入管理界面准备上云了。 首先是界面: 云服务器ECS-->实例 就可以看到你刚刚买的服务器了。你可以给它改名重启之类的。当然你最关心的应该是连接的问题。 名词解释:IP地址: 分为公网和内网(私有),公网就是可以在外面连接进来的IP地址,这个很重要,记下来。别人要访问你的 云电脑都靠他。 网络类型: 我也不懂,专业的应该 更好。 操作: 里面有很多按钮, 管理:就是进入实例的管理页面 远程连接:官方的远程连接页面 升降配:顾名思义花钱的地方 更多:里面有很多选项碰到在解释吧。目前就一个安全组很有用, 安全组: 管理进出服务器的流量的IP地址。 出方向,默认服务器可以到任何IP, 入方向,规定什么IP可以访问本地什么端口。 要远程连接 需开放 3389端口,接下来看看怎么开放3389接口 进入安全组后点配置规则 我们要配置的是入方向的端口和IP。 要添加端口点右上角 添加安全组规则 这样配置就行了。0.0.0.0/0 就是所有IP都能访问该端口。 (有3389的老哥就不用配置了,不过需要学会配置,后面还有别的端口需要开放) 然后需要吧 配置好的 安全组 对应到 服务器(实例) 点击加入对应的安全组就行了。 好了,前面解释的有点冗长,重点 是连接部分,首先点击 操作里面的远程连接 进入一个页面,第一次会告诉你连接密码。暂时先记住(后面可以修改), 输入密码-->发送远程命令 然后就是下面这个界面,这个初始密码我也不知道, 而且也没告诉你,所以只能自己去改了。 修改登录密码: 前面提到的 管理-->实例详情-->更多-->重置密码 改好之后就可以去登陆了。 三、用云这个系统登录以后还需要配置一些东西。 登录进去以后,左下角点一下进入服务器管理器,右边按照我红色标记设置。 接下来说一些实际需要用到的东西.。 Windows系统自带的远程连接:这是以后管理服务器最常用的手段。 首先,win+R 调出运行界面输入mstsc,会出现下面窗口 需要输入的就是 前面 服务器界面的 公网IP 用户名是administrator,密码是 远程连接密码(六位的)。不是登录密码 PS:一些其他的设置在左下角的显示选项里面,可以设置服务器和当前电脑文件互传之类的, 可以自行百度。 安全组:在实际开发的时候还需要开放一些 别的端口给外网。 下面稍微罗列一些 常用的: 80端口为HTTP网页访问的端口3389端口为远程桌面连接的端口21/tcp FTP 文件传输协议 22/tcp SSH 安全登录、文件传送(SCP)和端口重定向 443HTTPS 3306 Mysql(远程连接数据库用) 8080 Tomcat (做网站用) 当然后面Mysql和Tomcat的端口可以自己指定,3306和8080只是常用的端口。 最后这几天玩了一下阿里云服务器,学到了不少,来分享了一下,有些乱,还有些东西没写上来, 剩下的就是远程连接你的服务器,玩它就行了。了解更多产品详情可点击加关注

优秀的个人博客,低调大师

小程序https如何购买、配置

在阿里云找到SSL证书页面,阿里云提供免费的SSL证书 image.png 选择品牌 image.png 选择免费型 image.png 进入控制台就可以看到已经购买的证书了 image.png 补全信息 image.png 后面忘了截图,大概有以下几个步骤: 将文件上传到服务器指定位置,需要URL能够访问到(非https) 指定位置是一个隐藏文件夹,window下需要用mkdir命令创建 上传文件过一会就会自动验证成功 第3步很容易失败,建议直接在服务器上下载验证文件,多试几次 配置Apache或者Nginx # 添加 SSL 协议支持协议,去掉不安全的协议 SSLProtocol all -SSLv2 -SSLv3 # 修改加密套件如下 SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM SSLHonorCipherOrder on # 证书公钥配置 SSLCertificateFile cert/public.pem # 证书私钥配置 SSLCertificateKeyFile cert/215045620450170.key # 证书链配置,如果该属性开头有 '#'字符,请删除掉 SSLCertificateChainFile cert/chain.pem server { listen 443; server_name localhost; ssl on; root html; index index.html index.htm; ssl_certificate cert/215045620450170.pem; ssl_certificate_key cert/215045620450170.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } 分享一下我最终的配置(Apache虚拟站点) <VirtualHost *:443> SSLEngine on ServerName demo.com:443 SSLCertificateKeyFile "${SRVROOT}/conf/ssl_dict/215045620450170.key" SSLCertificateFile "${SRVROOT}/conf/ssl_dict/public.pem" SSLCertificateChainFile "${SRVROOT}/conf/ssl_dict/chain.pem" DocumentRoot "E:\wwwroot\demo.com\public" ServerName demo.com ServerAlias demo.com #START-ERROR-PAGE ErrorDocument 403 /403.html ErrorDocument 404 /404.html ErrorDocument 502 /502.html #END-ERROR-PAGE #startPHP <Files ~ "\.php$"> Options FollowSymLinks ExecCGI AddHandler fcgid-script .php FcgidWrapper "E:/BtSoft/WebSoft/php/7.1/php-cgi.exe" .php </Files> #endPHP #start301 #end301 #REFERER-START #REFERER-END #PROXY-START #PROXY-END <Directory "E:\wwwroot\demo.com\public"> Options FollowSymLinks ExecCGI AllowOverride All Require all granted DirectoryIndex index.php default.php index.html index.htm default.html default.htm </Directory> ErrorLog "logs/demo.com-error.log" CustomLog "logs/demo.com-access.log" common </VirtualHost> 推荐一个https相关的资料站 https://github.com/cheaphttps/https-start

优秀的个人博客,低调大师

10个Python练手小程序

【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: for i in range(1,5): for j in range(1,5): for k in range(1,5): if( i != k ) and (i != j) and (j != k): print (i,j,k) 阿里云代金券1000元免费领取地址:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=2a7uv47d 新老阿里云账户均可领取!可用于购买阿里云服务器ECS、云数据库RDS、虚拟主机、安骑士、DDoS高防IP等100多云计算产品。 代金券自领取之日起,有效期是30天,请及时使用,过30天后还可以重新领取。 【程序2】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: bonus1 = 100000 * 0.1bonus2 = bonus1 + 100000 * 0.500075bonus4 = bonus2 + 200000 * 0.5bonus6 = bonus4 + 200000 * 0.3bonus10 = bonus6 + 400000 * 0.15 i = int(raw_input('input gain:n'))if i <= 100000: bonus = i * 0.1 elif i <= 200000: bonus = bonus1 + (i - 100000) * 0.075 elif i <= 400000: bonus = bonus2 + (i - 200000) * 0.05 elif i <= 600000: bonus = bonus4 + (i - 400000) * 0.03 elif i <= 1000000: bonus = bonus6 + (i - 600000) * 0.015 else: bonus = bonus10 + (i - 1000000) * 0.01 print 'bonus = ',bonus 【程序3】 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后 的结果满足如下条件,即是结果。请看具体分析: 2.程序源代码: include "math.h"main(){long int i,x,y,z;for (i=1;i<100000;i++) { x=sqrt(i+100); /x为加上100后开方后的结果/ y=sqrt(i+268); /y为再加上168后开方后的结果/ if(xx==i+100&&yy==i+268)/如果一个数的平方根的平方等于该数,这说明此数是完全平方数/ printf("n%ldn",i); }} '''import mathfor i in range(10000): #转化为整型值 x = int(math.sqrt(i + 100)) y = int(math.sqrt(i + 268)) if(x * x == i + 100) and (y * y == i + 268): print i 题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊 情况,闰年且输入月份大于3时需考虑多加一天。 2.程序源代码: year = int(raw_input('year:n'))month = int(raw_input('month:n'))day = int(raw_input('day:n')) months = (0,31,59,90,120,151,181,212,243,273,304,334)if 0 <= month <= 12: sum = months[month - 1] else: print 'data error' sum += dayleap = 0if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)): leap = 1 if (leap == 1) and (month > 2): sum += 1 print 'it is the %dth day.' % sum 【程序5】 题目:输入三个整数x,y,z,请把这三个数由小到大输出。 1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换, 然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。 2.程序源代码: l = []for i in range(3): x = int(raw_input('integer:\n')) l.append(x) l.sort()print l 【程序6】 题目:用*号输出字母C的图案。 1.程序分析:可先用’*’号在纸上写出字母C,再分行输出。 2.程序源代码: print 'Hello Python world!n'print '' 10for i in range(5): print '* *' print '' 10print 'n' 6 【程序7】 题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有256个。不同字符,图形不一样。 2.程序源代码: a = 176b = 219print chr(b),chr(a),chr(a),chr(a),chr(b)print chr(a),chr(b),chr(a),chr(b),chr(a)print chr(a),chr(a),chr(b),chr(a),chr(a)print chr(a),chr(b),chr(a),chr(b),chr(a)print chr(b),chr(a),chr(a),chr(a),chr(b) 【程序8】 题目:输出9*9口诀。 1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 2.程序源代码: include "stdio.h"main(){ int i,j,result; printf("n"); for (i=1;i<10;i++) { for(j=1;j<10;j++) { result=i*j; printf("%d%d=%-3d",i,j,result);/-3d表示左对齐,占3位*/ } printf("n");/每一行后换行/ }}for i in range(1,10): for j in range(1,10): result = i * j print '%d * %d = % -3d' % (i,j,result) print '' 【程序9】 题目:要求输出国际象棋棋盘。 1.程序分析:用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。 2.程序源代码: include "stdio.h"main(){int i,j;for(i=0;i<8;i++) { for(j=0;j<8;j++) if((i+j)%2==0) printf("%c%c",219,219); else printf(" "); printf("n"); }}import sysfor i in range(8): for j in range(8): if(i + j) % 2 == 0: sys.stdout.write(chr(219)) sys.stdout.write(chr(219)) else: sys.stdout.write(' ') print '' 【程序10】 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。 2.程序源代码: import syssys.stdout.write(chr(1))sys.stdout.write(chr(1))print '' for i in range(1,11): for j in range(1,i): sys.stdout.write(chr(219)) sys.stdout.write(chr(219)) print ''

优秀的个人博客,低调大师

Python数据持久化-小测验

2018年7月13日考试 1.Python读写csv文件 现有如下图1所示的data.csv文件数据,请使用python读取该csv文件数据,并添加一条记录后输出如图2所示的output.csv文件(10分) 题1.png 这一题需要用到的csv文件 data.csv下载链接: https://pan.baidu.com/s/1JCUCU4vXBQNwOx2xhAjDqA 密码: pbpx 第1题 import csv def printCsv(csvName): with open(csvName) as csvFile: reader = csv.reader(csvFile) for i in reader: print(i) if __name__ == "__main__": inCsv = "data.csv" outCsv = "output.csv" with open(inCsv) as csvFile: reader = csv.reader(csvFile) data = list(reader) print("原csv文件data.csv的数据内容:") printCsv(inCsv) data.append(['Jack','104']) with open(outCsv,'w',\ newline='') as csvFile: writer = csv.writer(csvFile) writer.writerows(data) print("新产生的csv文件output.csv的数据内容:") printCsv(outCsv) 上面一段代码的运行结果如下: 原csv文件data.csv的数据内容: ['name', ' stuNo'] ['ZhangSan', ' 101'] ['LiSi', ' 102'] ['WangWu', ' 103'] 新产生的csv文件output.csv的数据内容: ['name', ' stuNo'] ['ZhangSan', ' 101'] ['LiSi', ' 102'] ['WangWu', ' 103'] ['Jack', '104'] 2.Python读写excel文件 如下所示的Excel表格数据,请编写python代码筛选出Points大于5的数据,并按Points进行排序后输出如图2所示的Excel文件结果 题2.png 这一题需要用到的excel文件 rank.xlsx下载链接: https://pan.baidu.com/s/1reS7yjxUjU1iqZc0rCjljA 密码: uymy import xlrd import xlwt if __name__ == "__main__": excel = xlrd.open_workbook("rank.xlsx") sheet = excel.sheet_by_index(0) #获取字段列表赋值给field_list,第2个字段大于5的数据列表赋值给data_list field_list = sheet.row_values(0) data_list = [] for i in range(1,sheet.nrows): if int(sheet.row_values(i)[2]) > 5: data_list.append(sheet.row_values(i)) #利用sorted内置函数排序 data_list = sorted(data_list,key=lambda x:x[2],reverse=True) #将获得的信息存入新表,命名为output.xlsx excel_w = xlwt.Workbook() sheet_w = excel_w.add_sheet("sheet1") for i in range(len(field_list)): sheet_w.write(0,i,field_list[i]) for i in range(len(data_list)): for j in range(len(data_list[i])): sheet_w.write(i+1,j,data_list[i][j]) excel_w.save("output.xls") 3.mysql数据库的sql语句 (1) 使用sql创建出如下图所示的数据表,数据库名为movies,表名为movieRank,表中包含MovieName、boxOffice、percent、days、totalBoxOffice五个字段,字段的信息如下图所示: 题3-1.png 创建语句.png (2)使用sql语句向movieRank表中添加若干条数据(材料中已提供movieData.txt) insert into movierank values("21克拉", 1031.92, 15.18, 2, 2827.06); insert into movierank values("狂暴巨兽", 2928.28, 43.07, 9, 57089.20); insert into movierank values("起跑线", 161.03, 2.37, 18, 19873.43); insert into movierank values("头号玩家", 1054.87, 15.52, 23, 127306.41); insert into movierank values("红海行动", 45.49, 0.67, 65, 364107.74); 插入数据的结果如下图所示: 插入结果图示.png (3)使用sql语句查询movieRank表中的数据并按照totalBoxOffice字段进行排序 select * from movierank order by totalboxoffice; (4)使用sql语句计算出字段totalBoxOffice字段的总和 select sum(totalboxoffice) from movierank; 4.Python操作mysql数据库 此题接第3题题干,在第三题的基础上完成以下需求: (1)编写python代码连接mysql数据库,并向movieRank表中新添加两条数据(已提供second.txt) import pymysql def getConn(database ="pydb"): args = dict( host = 'localhost', user = 'root', passwd = 'Leimysql8', charset = 'utf8', db = database ) return pymysql.connect(**args) if __name__ == "__main__": conn = getConn("movies") cursor = conn.cursor() insert_sql = 'insert into movierank values'\ '("犬之岛", 617.35, 9.08, 2, 1309.09),'\ '("湮灭", 135.34, 1.99, 9 , 5556.77)' cursor.execute(insert_sql) conn.commit() conn.close() (2)编写python代码,查询出所有的电影数据,并输出到一个Excel表movieRank.xlsx中,如下图所示 题4-2.png import pymysql import xlwt def getConn(database ="pydb"): args = dict( host = 'localhost', user = 'root', passwd = 'Leimysql8', charset = 'utf8', db = database ) return pymysql.connect(**args) if __name__ == "__main__": #从mysql数据库中取出数据赋值给data_list,其数据类型为元组 conn = getConn("movies") cursor = conn.cursor() select_sql = "select * from movierank " cursor.execute(select_sql) data_list = cursor.fetchall() field_list = [k[0] for k in cursor.description] #把data_list中的数据存入新的excel中,并命名为movieRank.xls excel = xlwt.Workbook() sheet = excel.add_sheet("sheet1") for i in range(len(field_list)): sheet.write(0,i,field_list[i]) for i in range(len(data_list)): for j in range(len(data_list[i])): sheet.write(i+1,j,data_list[i][j]) excel.save("movieRank.xls") 5.Python操作MongoDB数据库 (1)编写python代码连接MongoDB数据库,并新建一个building库,在building库下新建一个rooms表 from pymongo import MongoClient if __name__ == "__main__": conn = MongoClient("localhost") db = conn.building rooms = db.create_collection("rooms") (2)编写python代码读取rooms.csv文件的中的数据,并将数据插入到rooms表中,添加到rooms表中的数据结构如下图所示 image.png 这一题需要用到的csv文件rooms.csv下载链接: https://pan.baidu.com/s/10fyct-J3a0txtS-EZaaxAQ 密码: je33 from pymongo import MongoClient import csv if __name__ == "__main__": with open("rooms.csv") as csvFile: reader = list(csv.reader(csvFile)) field_list = reader[0] data_list = reader[1:] conn = MongoClient("localhost") db = conn.building rooms = db.rooms insert_list = [] for data in data_list: insert_list.append( {key:value for key,value in zip(field_list,data)}) rooms.insert_many(insert_list) 使用csv.DictReader方法 from pymongo import MongoClient import csv if __name__ == "__main__": conn = MongoClient("localhost") db = conn.building rooms = db.rooms with open("rooms.csv") as csvFile: reader = csv.DictReader(csvFile) for row in reader: rooms.insert_one(dict(row))

优秀的个人博客,低调大师

weex scroller滚动的小烦恼

【背景】 前几天的需求开发中,需要完成这样一个功能: 这还不简单?一个横向滚动的tag选择功能。一个横向scroller搞定问题。 但是做为一个对自己有“要求”的程序员,怎么可能会接受一个死气沉沉的滚动条。为了勾起用户的点击欲望,我毫不犹豫的增加了一个点击tag以后,tag自动移动到屏幕左侧位置的动画(如果内容不够,就不滚动)。看着流畅的动画,我在内心给自己点了好几个赞(最后一句忽略)。 【问题】 上线当天,测试的一个bug打破了我内心的小平静。在Ios手机上面出现了一个意想不到的问题:内容不够的情况,本不应该滚动的滚动条,奇迹般的滚动了! 期望的效果 实际的样子 最严重的问题是滚过去的tag,再也滚不回来了 【分析】 bug就在眼前,必须搞定! 在正式分析之前为表述方便做两个重要约定: 【重要约定】 scroller内容不足:scroller内部内容长度

优秀的个人博客,低调大师

Android RTL 及小语种 适配

版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/79504666 一、需要单独适配的原因 包括中文、英文、+-等各种符号,都是从左往右显示,而阿拉伯语、波斯语等则是从右往左显示,等等问题都需要进行本地化适配。 二、适配须知 2.1)RTL语言有以下6种: 阿拉伯语 ar Arbic العربية 波斯语 fa Persian فارسی 希伯来语 iw Hebrew עברית 乌尔都语(印度、巴基斯坦) ur Urdu اردو 维吾尔语 Uyghur 2.2)数字: 西阿拉伯数字:(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 东阿拉伯数字:(٠‎ - ١‎ - ٢‎ - ٣‎ - ٤‎ - ٥‎ - ٦‎ - ٧‎ - ٨‎ - ٩‎) 波斯数字:(۰ - ۱ - ۲ - ۳ - ۴ - ۵ - ۶ - ۷ - ۸ - ۹) 其他有一些语言也有自己的数字. 2.3) 强字符:具有明确方向的字符,这种类型字符的例子包括大多数字母字符、音节字符、汉语表意文字、非欧洲或非阿拉伯数字,以及这些语言脚本的标点。 弱字符:具有模糊方向的字符,这种类型字符的例子包括欧洲数字、中东阿拉伯-印度数字、算术符号和货币账号。许多语言脚本中的标点符号,如冒号、逗号。 中性字符:不根据上下文就无法确定方向性,例如段落分隔符、制表符和大多数其他空格字符。 三、需要进行的修改 一、控件的显示 “+8618310002000”这类号码会被显示成“8618310002000+”,就是因为阿拉伯语是从右往左显示的,所以加号显示在了最右边。 设置控件的textDirection属性即可,控制组件的文字对齐方式: android:textAlignment="viewStart" .setTextDirection(View.TEXT_DIRECTION_LTR); .setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START); 此外还有layoutDirection属性来设置组件的布局排列方式。 二、数字的格式化 比如,将西阿拉伯数字改成东阿拉伯数字。 西阿拉伯数字:(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 东阿拉伯数字:(٠‎ - ١‎ - ٢‎ - ٣‎ - ٤‎ - ٥‎ - ٦‎ - ٧‎ - ٨‎ - ٩‎) 这类问题又细分为以下几种: 1)纯数字,可以使用 Character.getNumericValue来转换,给控件设置LTR属性即可。 2)带有“+”,“,”等中性字符、弱字符符号,比如前者用在+86,后者用在分机号,可以给控件设置LTR属性,也可以通过BidiFormatter.getInstance().unicodeWrap(),它会根据上下文来添加LTR属性。 3)带有“@”等强字符符号,比如SIP账号“abc@10.239.224.22”,需要使用\u202A等标记来强制改变方向。同时空格等中性符号,如果在阿拉伯语环境下会显示成RTL,例如将号码“183 1000 2000”显示成“2000 1000 183”,因此也需要使用此类符号。 同时在场景中又细分为以下几种: 1)直接进行转换的数字:控件中展示给用户的数字,如“1秒、2秒” 2)用户的输入但是需要转换的数字:比如在联系人中输入号码10086,则转换成١٠٠٨٦ 3)不应该转换的数字:收到短信中包含数字,联系人名字中包含的数字(验证过iOS中也是处理) 同时记录另一个问题,在某些只能输入数字的情况下,iOS的键盘能够输入多种数字,Android目前看到的都只能输入西阿拉伯数字。 我针对上述情况拆分出以下3个方法。 1)localizeString(String str) 将字符串中的数字进行翻译,但不改变方向)。 例如10086,10010等共2人,会被翻译成“人2共等10086,10010”,(由于wiki本身RTL支持不好,我复制过来顺序都显示的错的,所以举例中只改了方向,数字文字都不变,下文同理)。 数字本身是LTR的,先翻译10086,逗号是弱性字符,跟着左边,再往后才是10010(这里应该让10086显示在右边比较好,但是考虑到这个场景问题不大,暂不处理),接下来是阿拉伯语,因此后面的方向是RTL的。 2)localizeNumber(String number) localizeNumber(String number, boolean nameIsNumber) 对号码中的数字进行翻译,默认nameIsNumber为true,当为false时表示为name,因此不翻译。 2.1)中性字符,例如加号 例如+8618310002000,当为阿拉伯语环境时,第一个+号显示出来之后根据上下文环境判断是RTL,因此号码显示在+号左边,最终是8618310002000+。此时使用View.TEXT_DIRECTION_LTR即可。 例如+86 183 1000 2000,当为阿拉伯语环境时,同上+号第一个显示,86紧随+号,同时空格也是中性字符,在RTL环境下也是继续往左显示,最终显示为2000 1000 183 86+。但此时添加View.TEXT_DIRECTION_LTR只能让+号显示正确,空格并不生效,原因尚不清楚。 2.2)弱字符:例如冒号、逗号 例如播分机号时10086,1,1,它会继承前面的顺序,因此顺序不变还是10086,1,1。如果是10086\u202B,1:2,这里的\u202B是RTL的属性,首先是10086,然后逗号前有RTL标记,因此其之后改变方向为RTL,所以最终是100861:2,。 2.3)强字符:例如@等符号 例如SIP号码123@10.238.24.140,@和阿拉伯语一样属于强字符,因此显示为10.238.24.140@123,这次需要使用\u202A标记来将方向改成LTR。 3)localizeDigit(String str, boolean isNeedLTR) 这个方法是最终用来处理的,因为处理有前提,不推荐外部调用,所以设置成了private。 当前需要改成LTR且环境是RTL时,才添加\202A标记,减少不必要的操作同时降低风险。 三、双向字符集 这类问题比较复杂,原生系统中也大量存在。 没有发现什么特别好的办法,加标记是可行的,但是很麻烦。比如使用\u200f和\202A等标记,具体就不展开讲了,核心内容在上一节已经举例讲过了。 四、参考 string-concatenation-containing-arabic-and-western-characters Universal_Character_Set_characters en.wikipedia.org/wiki/Bi-directional_text

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册