わかりましたので、正しいパーセンテージを計算する方法を見つけました。
どうやら、Illustrator はパス セグメントの数に応じてパーセンテージを計算します。パスが 2 つのセグメント (つまり 3 つの頂点) で構成され、パス テキストが適用されて 2 番目の頂点 (「中間」) に配置される場合、SVG ファイルの startOffset は 50% になります。各パス セグメントのサイズ。最初のセグメントの長さは 1000 ピクセルで、2 番目のセグメントはわずか 4 ピクセル (パスの合計の長さは 1004 ピクセル) です。テキストを 2 番目の頂点に配置すると、常に 50% になります。
反対側の SVG/ブラウザは、パスの合計の長さに応じてパーセンテージを計算します。したがって、上記の例を参照すると、テキストは 1000px の長さ (セグメントの数、したがって最初のセグメントの末尾を見ると 50%) ではなく、502px の 50% に配置されます。パスの全長。
「イラストレーターの割合」を「ブラウザの割合」に変換するには、次のようにします (最適化されていません)。
// Get the current percentage
var oldPercent = parseFloat(textPathNode.getAttribute('startOffset').split('%')[0])/100;
// Get the path
var parentPath = document.getElementById(textPathNode.getAttribute('xlink:href').split('#')[1])
// Get the path segments
var parentPath.getAttribute('d').match(/[MmLlHhCc][\d\,\.\-\s]+/g);
// Calculate the percentage for one segment
var percentPerSegment = 1/segments.length;
// Find out on which segment the textPath lies
var offsetIsOnSegmentNo = Math.floor(oldPercent/percentPerSegment);
// Calculate the length of that segment
var virtualPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');
virtualPath.setAttribute('d', 'M0,0'+segments[offsetIsOnSegmentNo]);
var segLength = virtualPath.getTotalLength();
// Calculate the total path length of the previous segments
var prevSegLength=0;
var prevD = '';
for(var i=0; i<offsetIsOnSegmentNo; i++)
prevD += segments[s];
var virtualPrevPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');
virtualPrevPath.setAttribute('d', 'M0,0'+prevD);
var prevPathLength = virtualPrevPath.getTotalLength();
// Calculate the actual path length for the old percentage
var totalLength = prevPathLength + segLength*(oldPercent-(percentPerSegment*offsetIsOnSegmentNo))/(percentPerSegment);
// Calculate the correct percentage
var newPercentage = totalLength / parentPath.getTotalLength();
textPathNode.setAttribute('startOffset', newPercentage*100+'%');