I'm not sure if there is a bug here. If I read the 8-bit character string
from a file and attempt to replace characters, it skips characters (majority
of the characters do get replaced). I'm attaching a simple test script which
fails to replace the characters in the string in the attached text file.

My current encoding is set to utf-8; if I set it to latin1, the same code
snippet works fine.



On Sun, Mar 20, 2011 at 4:05 PM, [email protected] <
[email protected]> wrote:

> ZyX,
>
> Thanks. I don't want to use option (1) for performance reasons. Option (2)
> almost worked; however, it fails to replace some characters.
>
> I wonder if I'm doing the "mappings" table correctly. Does this look right?
>
> map(range(128,255), 'iconv(nr2char(v:val),&enc,"latin1")')
>
> The character sequences that are not replaced start with these characters.
> Should these be escaped?
>
> dec: 221, <M-]>
> dec: 193, <M-A>
> dec: 215, <M-Z>
> ...
>
> If I switched from "utf-8" to "latin1", then everything works perfect. It
> has something to do with the encoding mode.
>
> Thanks again!
>
>
>
>
>
> On Sun, Mar 20, 2011 at 2:38 PM, ZyX <[email protected]> wrote:
>
>> Reply to message «Re: lazyredraw for encoding change?»,
>> sent 00:23:41 21 March 2011, Monday
>> by [email protected]:
>>
>> > I need to map each character to specific strings, for which I have a
>> > dictionary (mappings below) for each character 128-255. For example,
>> <97>
>> > maps to "AA". I use the substitute() function along with submatch to do
>> > that.
>> I would have used something like this:
>>
>>    let i=0
>>    let slen=len(str)
>>    let r=""
>>    while i<slen
>>        let c=char2nr(str[i])
>>        if c>128
>>            let r.=mappings[str[i]]
>>        else
>>            let r.=str[i]
>>        endif
>>        let i+=1
>>    endwhile
>>
>> Though I tested another option and it works:
>>
>>    echo substitute(str, "[\x7F-\xFF]", '\=mappings[submatch(0)]', "g")
>>
>> Note the single quotes around {pattern}: it will force pattern to contain
>> specific bites, not unicode characters.
>>
>> Original message:
>> > Hi ZyX,
>> >
>> > Here is a specific example:
>> >
>> > I have a string that has 8-bits characters in the 128-255 range
>> >
>> > :let a ="<97><9e>·<97>¢<96><9b>Ü<88>å<82>ÌÂ<98>Ð0"
>> >
>> > I need to map each character to specific strings, for which I have a
>> > dictionary (mappings below) for each character 128-255. For example,
>> <97>
>> > maps to "AA". I use the substitute() function along with submatch to do
>> > that.
>> >
>> > let retval = substitute(value, '\([\d128-\d255]\)',
>> > '\=mappings[submatch(1)]', "g")
>> >
>> > It appears to me that substitute() seems to be running based off the
>> > current encoding setting, even if I converted all the rest to "latin1"
>> > using iconv() functions.
>> >
>> >
>> > Thanks for any help!
>> >
>> > On Sun, Mar 20, 2011 at 1:54 PM, ZyX <[email protected]> wrote:
>> > > Reply to message «lazyredraw for encoding change?»,
>> > > sent 23:18:31 20 March 2011, Sunday
>> > > by [email protected]:
>> > >
>> > > What do you switch? 'encoding'? You are not supposed to do this ever,
>> why
>> > > don't
>> > > you use `iconv()', `scriptencoding utf-8', 'fileencoding', `e ++enc'
>> or
>> > > some
>> > > other stuff depending on what you actually do in your script. Can you
>> > > provide
>> > > more specific example?
>> > >
>> > > Original message:
>> > > > Hello All,
>> > > >
>> > > > I have a script which needs to manipulate strings in 8-bit
>> characters.
>> > >
>> > > So,
>> > >
>> > > > I switch between the current encoding and the 8-bit encoding.
>> However,
>> > >
>> > > the
>> > >
>> > > > screen redraws during the change of encoding. Is there a way to
>> > > > suppress it?
>> > > >
>> > > > Thanks!
>>
>
>

-- 
You received this message from the "vim_dev" 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
XGCڋxtFromGC

Attachment: test.vim
Description: Binary data

Raspunde prin e-mail lui