2016-11-11 197 views
9

我想將標記添加到從右向左書寫的(烏爾都語言)文本。我試圖使用GSUB爲目的,但一切到目前爲止,我已經試過不產生所需的輸出如何正確連接r中的雙向字符串?

text <- "یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے" 
pattern <- "کیا جا" 
replaceWith <- paste0("<somemark>", pattern, "</somemark>") 
gsub(pattern, replaceWith, text) 

GSUB返回以下

یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے 

所需的輸出。

enter image description here

我怎樣才能acheive所需的輸出?

注意:我甚至無法在我的文章中正確排版所需的輸出,我不得不依賴於圖像。

更新:儘管mysub函數正確連接字符串(在控制檯中),但我仍然面臨閃亮應用中文本順序不正確的問題。

mysub <- function(text, pattern){ 
beforePattern <- substr(text, 1, regexpr(pattern, text)[1]-1) 
afterPattern <- substr(text, regexpr(pattern,text)[1] + nchar(pattern), nchar(text)) 
result <- paste(afterPattern, replaceWith, beforePattern) 
result 
} 
+0

嗯,輸出基本上逆轉嗎?這可能是因爲字體?它是從右向左書寫的嗎? (對不起,我是歐洲人...) – drmariod

+0

不,據我所知,這不是一個字體問題 –

回答

1

我給它一個嘗試。不過,我確實冒昧地對參數進行了嚴格的編碼,而不是從會話中讀取。

Server: 

output$mysub <- function(){ # (text=NULL, pattern=NULL) 

text <- "یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے" 
pattern <- "کیا جا" 

Encoding(text) <- "UTF-8" 
Encoding(pattern) <- "UTF-8" 

print(text) 

beforePattern <- substr(text, 1, regexpr(pattern, text)[1]-1) 
afterPattern <- substr(text, regexpr(pattern,text)[1] + nchar(pattern), nchar(text)) 

replaceWith <- paste0("<somemark>", pattern, "</somemark>") 
result <- paste(afterPattern, replaceWith, beforePattern) 

# result <- paste(beforePattern, replaceWith, afterPattern) 
# Encoding(result) <- "UTF-8" 
print(length(result)) 
print(result) 

return(result) 
} 


# ui.R: 

h2(textOutput("mysub")) 

我上閃亮的網頁得到的輸出是: bidi text output

3

確實存在具有gsub沒有問題:

text <- dput("یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے") 
"<U+06CC><U+06C1> <U+062C><U+0645><U+0644><U+06C1> <U+0627><U+06CC><U+06A9> 
<U+0645><U+062B><U+0627><U+0644> <U+06A9><U+06D2> <U+0644><U+06CC><U+06D2> 
<U+0627><U+0633><U+062A><U+0639><U+0645><U+0627><U+0644> <U+06A9><U+06CC> 
<U+0627> <U+062C><U+0627> <U+0631><U+06C1><U+0627> <U+06C1><U+06D2>" 

pattern <- dput("کیا جا") 
"<U+06A9><U+06CC><U+0627> <U+062C><U+0627>" 

replaceWith <- dput(paste0("<somemark>", pattern, "</somemark>")) 
"<somemark><U+06A9><U+06CC><U+0627> <U+062C><U+0627></somemark>" 

dput(gsub(pattern, replaceWith, text)) 
"<U+06CC><U+06C1> <U+062C><U+0645><U+0644><U+06C1> <U+0627><U+06CC><U+06A9> 
<U+0645><U+062B><U+0627><U+0644> <U+06A9><U+06D2> <U+0644><U+06CC><U+06D2> 
<U+0627><U+0633><U+062A><U+0639><U+0645><U+0627><U+0644> <somemark><U+06A9> 
<U+06CC><U+0627> <U+062C><U+0627></somemark> <U+0631><U+06C1><U+0627> 
<U+06C1><U+06D2>" 

結果的呈現(同時包含從右到左,從左到右字符的字符串)也很符合邏輯的對我說:

  1. 字符串的開頭包含從右到左的從右到左的字符

یہ جملہ ایک مثال کے لیے استعمال

  • 那麼字符串繼續從左至右字符。據呈現的左到右,並在結束時(的什麼先前渲染的左側)加入,
  • یہ جملہ ایک مثال کے لیے استعمال <somemark>

  • 然後字符串以權繼續向左字符。它呈現從右到左,並在結束時加入,
  • یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا

  • 那麼字符串繼續從左向右字符。它呈現從左到右,在結束時加入,
  • یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark>

  • 最後字符串以從右到左的字符結束。它從右向左渲染並添加到最後。
  • یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے

    你的什麼應該被渲染似乎沒有給我更多的邏輯,但我必須承認,我沒有與從右到左文本渲染經驗的想法。

    無論如何,如果格式必須通過像HTML的<b>...</b>標籤渲染來解釋,那麼它完美的作品(以降價/ HTML):

    یہ جملہ ایک مثال کے لیے استعمال <b>کیا جا</b> رہا ہے

    呈現爲

    یہ جملہایکمثالکتلئےاستعمالکیاجارہاہडी

    我還沒有設法打印什麼都不閃亮,但q題目了標記:

    ???? ???????? ?????? ???????? ???? ?????? ?????????????? <somemark>?????? ????</somemark> ?????? ????

    +0

    正如你所說的,在markdown + html中渲染效果非常好,在閃亮渲染是有問題的。是否可以添加unicode控制字符來指示字符串的從右到左和從左到右的呈現? –

    +0

    @ImranAli,是的,unicode控制字符在這裏很有用:'gsub(pattern,replaceWith,paste0(「\ u202b」,text,「\ u202c」))'似乎工作。有關更多詳細信息,請參閱我的答案[此處](https://stackoverflow.com/a/45109292/1851712)。 – Henrik