Perforce(P4)服务器设置Unicode模式解决中文文件、文件夹乱码问题

问题出现时的环境是这样的:p4d位于Linux服务器中,P4ROOT通过默认方式创建,并没有开启Unicode。客户端有Windows的P4V和Mac的P4V,此时用P4Admin查看服务器状态时可以看到Server Info中的Unicode support:是disabled的,这时在Windows端建立workspace并添加中文的文件、文件夹,Mark for add再Submit到服务器depot后,在Mac端的P4V直接查看Depot上的文件夹和文件时就会看到中文都变成了乱码,Get下来后也是会像%20这样的方式保存成文件名、文件夹名。检查后发现在服务器端没有开启Unicode模式时,客户端P4V中Connections菜单项内的Choose Character Encoding…是置灰的,而Perferences中Display内的Set encoding for all connections to:的选项在Windows上是CP936 GBK,Mac上是UTF-8,正是由于这个客户端非Unicode编码差异导致了Win上上传的中文在Mac下显示为乱码的问题。另外这时如果强制改变P4CHARSET环境变量,或通过命令行p4 set的方式改变连接的字符编码为UTF-8,再打开连接时会得到:“Unicode clients require a unicode enabled server”这样的错误提示!解决方法就是改变p4d服务器端的编码设置为Unicode模式:

切换Unicode模式的方法很简单,就是通过p4d命令行,在当前路径为P4ROOT的位置执行p4d -xi,成功的话会得到会在unicode mode运行的提示,显然这个操作在刚建好P4ROOT时执行是100%没问题的,但如果是在已经使用了一段时间的root中执行,往往就会因为有过非Unicode编码文字的操作而导致类似这样的错误:

Table db.user has 14 rows with invalid UTF8.

Table db.domain has 1 rows with invalid UTF8.

Perforce server error:
Database has 14 tables with non-UTF8 text and can’t be switched to Unicode mode.

这时就需要对root中的数据库信息进行手动编码转换了:
首先要停掉p4d服务,可以使用行p4 admin stop来完成,这里如果没有设置过连接环境变量参数的话,可以先执行p4 -p 192.168.0.1:1666 -u username login,输入账号username对应的密码进行登录验证,成功后再执行p4 -p 192.168.0.1:1666 -u username admin stop来关掉服务。
下一步需要创建checkpoint备份,命令行如下:p4d -r root -jc,其中root是实际p4root文件夹所在路径,执行后会创建checkpoint.x和checkpoint.x.md5两个备份文件以及更新journal.x的信息。需要手动修改的就是checkpoint.x这个文件中的文本编码,我用的是windows下的programmer’s notepad直接修改文件编码为UTF-8,然后保存,这样虽然可以保证编码都切换到UTF-8但可能会导致部分文本出错,尤其是在db信息中既有windows端提交的中文(GBK编码)又有Mac端提交的中文(UTF-8)编码时,如果在意的话就用其它工具或者手动校正所有中文文字后再保存。另外还要更新.md5中的校验码,使用hashtab之类的工具查看下修改后的checkpoint文件md5码更新了即可。
将修改后的两个checkpoint文件覆盖回服务器端后,删除p4root中的所有db.*文件,然后执行p4d -r $P4ROOT -jr checkpoint_file journal_file,恢复刚才修改过的checkpoint文件,journal选最新的即可。恢复完成后再次使用p4d -xi命令就可以成功转换为unicode模式了,启动p4d服务,然后看下P4Admin中已经显示Unicode support: enabled了,同时还会注意到P4V会提示选择编码了,选择UTF-8即可,而切换Unicode模式之前的Choose Character Encoding…不可用问题也解决了,可以通过这个选项修改Connection的文本编码了。再次测试中文文件名,各系统下均可正常显示了。

博主友情提示:

如在您的评论中需要提及如QQ号、微信号、电子邮件地址或其他隐私敏感信息,欢迎通过>>博主专用加密工具v2<<加密后发布,原文只有博主可以看到。