30天自制操作系统吧 关注:1,381贴子:4,825
  • 12回复贴,共1

30天下的中文显示教程

只看楼主收藏回复

虽然曾经有一篇贴吧,叫做“28天末,中文显示成功”,里面就写了中文显示,还配了代码。但具体的思路是怎样的,我们依旧一无所知。这几天逛知乎发现一个好帖子,个人认为实现中文显示的方法比那篇帖子简单。


1楼2023-06-17 12:58回复
    2L喂度娘,3L开始


    2楼2023-06-17 12:58
    回复
      首先制作中文字体的字模。书里提到了这一部分的操作:

      HZK16的字库很容易在网上找到。不想找的话也可以去这个链接:
      ht[doge]tps://ww[doge]ti.la[doge]nzo[doge]uj.co[doge]m/ijzQp0zckvwb(请去掉所有的[doge])


      4楼2023-06-17 13:06
      回复
        接下来就是合并英文字模和中文字模了(不这么搞还得做很多麻烦的处理)。直接使用下面的cmd命令:
        copy /b hankaku.bin + HZK16 HZK16.org
        即可将hankaku.bin与HZK16合并。
        (我并没有按书中所述提取前165440字节,因为那样不能显示的字有点多。)


        5楼2023-06-19 19:32
        回复
          HZK16.org到手之后,想tek压缩可以tek压缩一下,然后给压缩后的文件命名为nihongo.fnt;不压缩的话就直接把HZK16.org改名为nihongo.fnt即可(这样可以不用管那么多东西,比如更改文件名之类的)。


          6楼2023-06-20 18:34
          回复
            现在我们字库就已经有了。接下来我们打开graphics.c,找到putfonts8_asc的部分。下面是在实现EUC显示后它的样子:

            我们将对这一部分进行更改。(后面注释乱码是因为我开的字符编码是utf-8而不是shift-jis)


            7楼2023-06-20 18:38
            回复
              书里说直接使用这一部分就可以实现中文显示了。是这样的吗?
              我们可以准备一个中文文档进行测试,结果如下:

              日文乱码了,英文没有乱码,这两部分非常正常。然而,“中文显示测试”这6个字并没有如期显示。


              8楼2023-06-20 18:46
              回复
                为什么呢?这里我们就要提到一个重要的概念:字库的左右结构和上下结构。顾名思义,左右结构的字库先保存左半边的16进制数据,再保存右半边的16进制数据;而上下结构则是先保存上半边的16进制数据,再保存下半边的16进制数据。
                书中所用到的jpn16v00.bin是左右结构的字库,但我们用到的HZK16是上下结构的。因此乱码非常正常。


                9楼2023-06-20 18:49
                回复
                  显然,现在有两条路可走:一种是做一个上下结构字库专用的显示,另一种就是把上下结构的字转换成左右结构,再调用左右结构字库的显示。我们选择后一种方法,因为它用到的代码更少(我只添加了3行就达到了目的)。


                  10楼2023-06-20 18:50
                  收起回复
                    上下结构的字怎么转换成左右结构?上下结构的字是按行存储的,显然第一个字节就是左半角的,第二个字节就是右半角,第三个字节又是左半角,以此类推。那么我们写一个循环即可,代码如下(这里只截了task->langmode == 2中else的部分):

                    个人认为代码比较好理解,唯一要注意的就是第一个字节代表的是索引0。


                    11楼2023-06-20 18:54
                    回复
                      重新make run_full,结果如下:
                      可以看到中文显示已经成功了一半了,但是前面的“中文显”3个字并没有打印出来,只打印了“示测试”3个字。这是个很奇怪的bug,我推测是IPL加载的柱面数不够导致。
                      打开ipl09.nas,把:

                      改成:

                      make run_full,再试一遍看看,结果如下:

                      显示成功!看起来果然是IPL的问题!


                      12楼2023-06-20 19:03
                      回复
                        现在的默认显示模式仍然是shift-jis,我们为了方便可以自行修改为euc(GB2312),我就不贴代码了(逃
                        哦对了,请记住测试文档必须使用GB2312/记事本中的ANSI编码!不能用UTF-8!不能用UTF-8!不能用UTF-8!


                        13楼2023-06-20 19:12
                        回复