On 04/11/10 12:09, Luc Hermitte wrote:
Hello,

I'm in the process on upgrading my scripts to support multi-byte strings.
I've identified a few needs for now:
- a mbyte strlen
- a get-at(pos) operator

Regarding string length, |strlen()| recommends to play with substitute(), 
however I see strwidth() that seems to do the work, is there a reason that this 
is not the recommended way ?

Regarding [] alternative, matchstr('.\{'.pos.'}\zs.\ze') does the job (for pos> 
 0). Is there a better way to proceed ?


If your text includes Chinese, Japanese, Korean, or maybe (I'm less sure) hard tabs, the results will be different:

* strlen(string) is a number of 8-bit bytes in memory
* strwidth(string) is a number of display cells in a Vim window
* strlen(substitute(string, '.', 'a', 'g')) is a number of logical "characters", each of which can be one hard tab (one byte, between one and 'tabstop' cells), one ASCII printable character (one byte, one cell), one Chinese character (two or sometimes four bytes in GB18030, three or four bytes in UTF-8, two cells), etc.

You might want to use the {count} argument of matchstr:

(untested)
        let elemfound = matchstr(string, '.', 0, pos+1)
        if elemfound == ""
                " not found
        else
                " found
        endif

Best regards,
Tony.
--
Nothing is illegal if one hundred businessmen decide to do it.
                -- Andrew Young

--
You received this message from the "vim_use" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

Reply via email to