获取Twitter字符数

时间:2018-10-07 12:54:00

标签: ios swift string xcode twitter

我有一个程序,它是Twitter tweets的编辑器,它计算文本以使其少于280个字符,这是twitter限制。

我将utf8属性用于这样的

%% DCT transformation
I = imread('cameraman.tif');
I = im2double(I);
T = dctmtx(8); %returns the 8-by-8 DCT transform matrix
dct = @(block_struct) T * block_struct.data * T';
B = blockproc(I,[8 8],dct);
% Here I want to apply my function applyMask to blocks of 8x8 individualy
%this function will take a block 8x8, sort it, pick 8 biggest ones, save
%them and set rest to zero
f = @applyMask;
b = f(B)
function y = applyMask(x)
vector = x(:); %retransform matrix to be sorted
y=zeros(8,8)   %prepare matrix where 8 biggest values will be stored (rest is zero)
sorted = transpose(sort(vector,'descend')) %sort vecotr in descending order
pick = sorted(1:1, 1:8) %takes just first 8 biggest values 
for k=1 : 8
for i=1 : 8
    for j=1 : 8
        if ((x(i,j)==pick(1,k)) && nnz(y)<8 ) %if there is one of the 8 biggest - keep
           y(i,j)= pick(1,k) %put 8 biggest values to matrix
        end
    end
end

end
end

结果= 3

这个符号(℞)更像是它在twitter计数器中仅需要2个字符,但是此代码中的结果却给了我3个字符,所以我无法为用户提供确切的字符数!

如何获取正确的计数:2

1 个答案:

答案 0 :(得分:2)

Counting characters

  

推文长度是通过NFC中的代码点数量来衡量的   文本的标准化版本。

在Swift中,您可以通过precomposedStringWithCanonicalMapping获得NFC规范化形式,并通过unicodeScalars.count获得代码点数。

因此,Swift中正确的代码应如下所示:

var str = "℞"
let r = str.precomposedStringWithCanonicalMapping.unicodeScalars.count
print(r) //->1

上面的代码显示了与网络上某些字符计数器一致的结果,我不明白为什么您为2得到


(感谢Rakesha Shastri。) 我相信上面的代码正确地实现了我上面链接的文档中描述的规范。

但是据报道,实际的Twitter不能完全按照文档中的方式工作。 (对不起,我不发推文。)我们可能需要猜测或找到其他可靠的来源,以使其适合实际的Twitter。


我尝试了官方库text Tweet parsing library,但显示的结果与我的代码相同。

let len = TwitterText.tweetLength(str)
print(len) //->1

(尽管TwitterText.tweetLength(_:)的代码处理t.co links时要复杂得多。因此,当文本中包含某些URL时,它会产生与我的代码不同的输出。)


更新

我不确定引荐的Twitter应用不是开源的,但我想它们正在显示文本推文解析库页中所述的加权长度上方链接。

使用pod导入库时,您可能需要编写类似的内容。

let config = TwitterTextConfiguration(fromJSONResource: kTwitterTextParserConfigurationV2)
let parser = TwitterTextParser(configuration: config)
let result = parser.parseTweet(str)
print(result.weightedLength) //->2