如何正确连接r中的双向字符串?
我想将标记添加到从右向左书写的(乌尔都语言)文本。我试图使用GSUB为目的,但一切到目前为止,我已经试过不产生所需的输出如何正确连接r中的双向字符串?
text <- "یہ جملہ ایک مثال کے لیے استعمال کیا جا رہا ہے"
pattern <- "کیا جا"
replaceWith <- paste0("<somemark>", pattern, "</somemark>")
gsub(pattern, replaceWith, text)
GSUB返回以下
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے
所需的输出。
我怎样才能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
}
我给它一个尝试。不过,我确实冒昧地对参数进行了严格的编码,而不是从会话中读取。
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"))
确实存在具有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>"
结果的呈现(同时包含从右到左,从左到右字符的字符串)也很符合逻辑的对我说:
- 字符串的开头包含从右到左的从右到左的字符
یہ جملہ ایک مثال کے لیے استعمال
- 那么字符串继续从左至右字符。据呈现的左到右,并在结束时(的什么先前渲染的左侧)加入,
- 然后字符串以权继续向左字符。它呈现从右到左,并在结束时加入,
- 那么字符串继续从左向右字符。它呈现从左到右,在结束时加入,
- 最后字符串以从右到左的字符结束。它从右向左渲染并添加到最后。
یہ جملہ ایک مثال کے لیے استعمال <somemark>
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark>
یہ جملہ ایک مثال کے لیے استعمال <somemark>کیا جا</somemark> رہا ہے
你的什么应该被渲染似乎没有给我更多的逻辑,但我必须承认,我没有与从右到左文本渲染经验的想法。
无论如何,如果格式必须通过像HTML的<b>...</b>
标签渲染来解释,那么它完美的作品(以降价/ HTML):
یہ جملہ ایک مثال کے لیے استعمال <b>کیا جا</b> رہا ہے
呈现为
یہ جملہایکمثالکتلئےاستعمالکیاجارہاہडी
我还没有设法打印什么都不闪亮,但q题目了标记:
???? ???????? ?????? ???????? ???? ?????? ?????????????? <somemark>?????? ????</somemark> ?????? ????
正如你所说的,在markdown + html中渲染效果非常好,在闪亮渲染是有问题的。是否可以添加unicode控制字符来指示字符串的从右到左和从左到右的呈现? –
@ImranAli,是的,unicode控制字符在这里很有用:'gsub(pattern,replaceWith,paste0(“\ u202b”,text,“\ u202c”))'似乎工作。有关更多详细信息,请参阅我的答案[此处](https://*.com/a/45109292/1851712)。 – Henrik
嗯,输出基本上逆转吗?这可能是因为字体?它是从右向左书写的吗? (对不起,我是欧洲人...) – drmariod
不,据我所知,这不是一个字体问题 –