如何正确连接r中的双向字符串?

问题描述:

我想将标记添加到从右向左书写的(乌尔都语言)文本。我试图使用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

不,据我所知,这不是一个字体问题 –

我给它一个尝试。不过,我确实冒昧地对参数进行了严格的编码,而不是从会话中读取。

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

确实存在具有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. 字符串的开头包含从右到左的从右到左的字符

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

  1. 那么字符串继续从左至右字符。据呈现的左到右,并在结束时(的什么先前渲染的左侧)加入,
  2. یہ جملہ ایک مثال کے لیے استعمال <somemark>

    1. 然后字符串以权继续向左字符。它呈现从右到左,并在结束时加入,
    2. یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا

      1. 那么字符串继续从左向右字符。它呈现从左到右,在结束时加入,
      2. یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark>

        1. 最后字符串以从右到左的字符结束。它从右向左渲染并添加到最后。
        2. یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے

          你的什么应该被渲染似乎没有给我更多的逻辑,但我必须承认,我没有与从右到左文本渲染经验的想法。

          无论如何,如果格式必须通过像HTML的<b>...</b>标签渲染来解释,那么它完美的作品(以降价/ HTML):

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

          呈现为

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

          我还没有设法打印什么都不闪亮,但q题目了标记:

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

        开始=“5”>
      开始=“4”>
    开始=“3”>
开始=>
+0

正如你所说的,在markdown + html中渲染效果非常好,在闪亮渲染是有问题的。是否可以添加unicode控制字符来指示字符串的从右到左和从左到右的呈现? –

+0

@ImranAli,是的,unicode控制字符在这里很有用:'gsub(pattern,replaceWith,paste0(“\ u202b”,text,“\ u202c”))'似乎工作。有关更多详细信息,请参阅我的答案[此处](https://*.com/a/45109292/1851712)。 – Henrik