2017-08-15 52 views
0

當我問這個問題Transform patterns of code points in a binary 1小時前:我需要像集轉換[$a-z]成這樣的二進制:奇怪字節轉換代碼點集合轉換成二進制

01 24 // $ 
00 // interval between 2 code points 
61 00 // a 
7a 00 // z 

我得到像集從[$a-z]UnicodeSet網站。它只需要您輸入一個模式並生成一個代碼點集。

我已經重寫了一些我簡單但不重要的UnicodeSet二進制集轉換器。現在,我通過在UnicodeSet站點上啓用Escape選項來讀取它們的轉義表格\u,而不是閱讀真實代碼點。我這樣做是因爲瀏覽器會從返回的集合中去掉一些字符。

然而,我自己將模式[:age=5.0:]&[[:gc=L:][:gc=Nl:][:gc=Mn:][:gc=Mc:][:gc=Nd:][:gc=Pc:]\$_]由模式[:age=5.0:]&[[:gc=L:][:gc=Nl:][:gc=Mn:][:gc=Mc:][:gc=Nd:][:gc=Pc:]\$_]返回的集合的最終輸出看起來有錯誤的代理。

drugs...

我的閱讀和輸入設定跳過個別代碼點功能nextCodePoint

function nextCodePoint() 
    { 
     u_ch = input.charCodeAt(inputOffset); 
     __escaped__ = false; 

     // Handle escape 
     if (u_ch === 0x5C) 
     { 
     __escaped__ = true; 
     u_ch = input.charCodeAt(inputOffset + 1); 

     // Handle \u 
     if (u_ch === 0x75) 
     { 
      inputOffset += 2; 

      // Skip the left XXXX base 
      u_start = inputOffset; 
      inputOffset += 4; 

      // Skip the right XXXX base (limited for messy patterns) 
      if (input.charCodeAt(inputOffset) !== 0x5C) 
      inputOffset += 4; 

      return parseInt(input.slice(u_start, inputOffset), 16); 
     } 
     } 
     ++inputOffset; 
     return u_ch; 
    } 

任何想法?

+0

到底是什麼輸入,什麼是預期的輸出,並且那是什麼功能的實際輸出? – Bergi

+0

@Bergi輸入是一個包含由UnicodeSet站點返回的代碼點集的文件,我們在這裏放置諸如'[:gc = L:]'的模式。我的問題中甚至有一個。輸出非常大,很難確定我不能放在這裏。 – Hydro

+0

@Bergi請忽略我關於較大代碼點的警告。我看起來錯了。 – Hydro

回答

0

我的UTF-16編碼是正確的,但問題是我找了\u轉義,但也沒有\U轉義。 UnicodeSet站點在某些部分返回\uXXXX\UXXXXXXXX

這裏:

function nextCodePoint() 
{ 
    u_ch = input.charCodeAt(inputOffset); 
    __escaped__ = false; 

    // Handle escape 
    if (u_ch === 0x5C) 
    { 
    __escaped__ = true; 
    u_ch = input.charCodeAt(inputOffset + 1); 

    u_upper = (u_ch === 0x55); 

    // Handle \u 
    if (u_upper || (u_ch === 0x75)) 
    { 
     inputOffset += 2; 

     // Skip the left XXXX base 
     u_start = inputOffset; 
     inputOffset += 4; 

     // Skip the right XXXX base 
     if (u_upper) inputOffset += 4; 

     return parseInt(input.slice(u_start, inputOffset), 16); 
    } 
    } 
    ++inputOffset; 
    return u_ch; 
}